使用Resque-scheduler和redis

时间:2017-04-29 06:22:03

标签: ruby-on-rails redis delayed-job rails-activejob resque-scheduler

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

这是我的工作。

  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         

在我的作业模型中:

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

这里,一旦创建了一个分配记录,状态通常保持为&#34;分配&#34;在它创建时。现在,从创建时起,如果用户未在指定时间内更新状态,则作业必须自动将状态更新为&#34;拒绝&#34;。

我也尝试过这种方法。

def enqueue_check_status 
  Resque.enqueue_at_with_queue('auto_rejection_queue', 2.minutes.from_now, 
   AutoRejectionJob, assignment_id: self.id)  
end

他们都将作业发送到resque延迟队列但是没有将作业带到主队列执行。

AutoRejection Job enqueuing in delayed jobs list

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

All schedules for the first job in the delayed list

我在这个问题上坚持了差不多两个星期。请帮忙!如果需要更多信息,请告诉我。与这个人度过了艰难的时光。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。

基本上让工人跑步本身并不足以处理延迟的工作。必须运行一个特殊的rake任务:

$ PIDFILE=./resque-scheduler.pid BACKGROUND=yes \
    rake resque:scheduler

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

就我而言,我使用capistrano-resque gem来部署和管理工作者(在capistrano部署新版本时重新启动它们),方法是将该行添加到deploy.rb文件中:

after "deploy:restart", "resque:restart"

虽然这会加载我的工作者(并按原样重新启动它们),但您需要添加额外的行(到deploy.rb):

after 'passenger:restart', 'resque:scheduler:restart'

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

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

如上所述,如果确实遇到问题,请确保您的rake resque:scheduler任务可以访问环境变量 - 或者它无法正常工作。