如何暂时停止Resque Queues处理新作业?

时间:2016-06-16 00:16:45

标签: ruby resque job-control

有没有办法告诉所有工人停止处理特定队列(或所有队列)的任何新作业?

我们偶尔会遇到需要的系统不可用(断电,硬件故障等)的问题,在系统重新联机之前关闭这些队列中的作业处理会很有帮助。

代替每个作业确定所有子系统都处于良好/不良状态,有一些信号表明队列处于休眠状态,然后在子系统再次准备就绪时将它们恢复活动将会很有帮助。

一种严厉的方式是外部关闭所有工人。

2 个答案:

答案 0 :(得分:0)

文档提到您可以使用这些信号来启动/继续重新启动作业。

  

信号

     

Resque工作人员回应了几个不同的信号:

     

...

     

USR2 - 不要开始处理任何新工作

     

CONT - 在USR2之后再次开始处理新作业

来自:https://github.com/resque/resque/tree/cf0897709e857bd557dc7e407e282dc0f2b461df#signals

答案 1 :(得分:0)

This gist,显示了如何修补resque以停止接收新工作。

暂停resque后,它可能仍在处理一些工作。这是一个rake任务,等待所有工作完成10分钟,10分钟后,如果还有工作,他们会被杀死:

  stop_at = Time.now

  until Resque.working.empty?
    Rails.logger.info "Waiting for #{Resque.info[:working].length} jobs to finish"

    sleep(30.seconds)

    if stop_at < 10.minutes.ago
      Rails.logger.info 'Killing all jobs that didnt finish in 10 minutes...'
      Resque.working.map(&:unregister_worker)
    end
  end