首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Resque-scheduler和redis时,在上述延迟时间过后,延迟作业未进入主作业队列

使用Resque-scheduler和redis时,在上述延迟时间过后,延迟作业未进入主作业队列
EN

Stack Overflow用户
提问于 2017-04-29 14:22:03
回答 1查看 1.6K关注 0票数 4

我需要执行这样一项工作:每次创建订单时,都会将其分配给供应商,如果供应商不接受订单并在指定时间内更新状态,则订单将被自动拒绝,状态将更新为已拒绝。我面临的问题是,作业进入延迟队列,如resque web视图中所示,但在指定时间后没有移动到主队列以延迟时间。

这是我的工作。

代码语言:javascript
复制
  class AutoRejectionJob < ActiveJob::Base
    queue_as :auto_rejection_queue

   def perform(*args) 
    assignment_id = args[0]
    order_assignment = Estamps::Assignment.find(assignment_id)
    if order_assignment.status_id == 1 || order_assignment.status_id == nil
      order_assignment.status_id = 3
      order_assignment.save!
    end
   end
  end         

在我的任务模型中:

代码语言:javascript
复制
class Estamps::Assignment < ActiveRecord::Base
 after_create :enqueue_check_status 

def enqueue_check_status #  
  AutoRejectionJob.set(wait: 2.minutes).perform_later(self.id)
end    
end

在这里,一旦创建了分配记录,其创建时的状态通常保持为“已分配”。现在,从创建时起,如果用户在指定时间内没有更新状态,作业必须自动将状态更新为"rejected“。

我也尝试过这种方法。

代码语言:javascript
复制
def enqueue_check_status 
  Resque.enqueue_at_with_queue('auto_rejection_queue', 2.minutes.from_now, 
   AutoRejectionJob, assignment_id: self.id)  
end

它们都将作业发送到重新排队的延迟队列,但不将作业带到主队列来执行。

此外,作业的时间戳显示,当我单击延迟作业的all schedules链接时,没有列出要计划的作业

我被这个问题困扰了将近两个星期。求求你救命!如果需要更多信息,请告诉我。有一段艰难的时间与这一点。

EN

回答 1

Stack Overflow用户

发布于 2017-08-09 09:25:19

我已经解决了这个问题。

基本上,让工作进程运行本身并不足以处理延迟的作业。您必须运行一个特殊的rake任务:

代码语言:javascript
复制
$ PIDFILE=./resque-scheduler.pid BACKGROUND=yes \
    rake resque:scheduler

resque:scheduler rake任务检查计划的作业和延迟的作业(默认情况下每隔5秒),并将它们移动到您的工作人员进行处理。你可以在官方resque-scheduler gem readme上阅读更多关于如何配置和设置resque:scheduler rake任务及其设置的信息。

在我的例子中,通过在deploy.rb文件中添加行,我使用capistrano-resque gem来部署和管理工作进程(在capistrano部署新版本时重新启动它们):

代码语言:javascript
复制
after "deploy:restart", "resque:restart"

虽然这加载了我的workers (并按需要重新启动了它们),但您需要添加额外的行(到deploy.rb):

代码语言:javascript
复制
after 'passenger:restart', 'resque:scheduler:restart'

让capistrano为您运行resque:scheduler任务。

在我这样做之后,一切都运行得非常完美(实际上是回溯加载了本应已处理但尚未处理的延迟作业)。

然而,如上所述,如果您确实有问题,请确保您的rake resque:scheduler任务有权访问环境变量-否则它将无法工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43692485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档