Sidekiq:停止跑步工人

时间:2014-12-01 17:21:47

标签: ruby sidekiq worker

我想取消工人的执行。 我有这份工作,例如:  #<Sidekiq::Cron::Job:0x007f1f66a869c0 @name="Crawler-job_data-source=10", @cron="20 */5 * * *", @klass="HardWorker", @status="enabled", @last_enqueue_time=2014-12-01 10:57:19 -0300, @args=[10], @message="{\"retry\":1,\"queue\":\"default\",\"unique\":true,\"class\":\"HardWorker\",\"args\":[10]}"> 我使用@cron="20 */5 * * *"设置了工作人员的执行。

有两个可能性:

1)工人每0小时从0小时20分钟开始

2)当我尝试这样做时,工作人员立即开始:HardWorker.perform_async(anId)

当我尝试HardWorker.perform_async(anId)时,它会返回一个ID,例如"f80b29495c44a34ded9a333f"

在执行perform_async方法后,有没有取消sidekiq工作人员?

4 个答案:

答案 0 :(得分:2)

不,你不能通过Sidekiq取消工作。您可以在应用程序中构建此类逻辑。

答案 1 :(得分:0)

看看sidekiq附带的sinatra应用程序: https://github.com/mperham/sidekiq/wiki/Monitoring

您可以从该界面取消预定作业。

答案 2 :(得分:0)

使用https://github.com/utgarda/sidekiq-status(可让您跟踪工作),您可以取消安排工作。

例如,您可以跟踪下次执行时间,如果需要,您可以取消它。

或者您可能希望包含某种逻辑,以确保完成作业。 (这样你实际上根本不需要取消安排)

def perform
  return unless should_perform?(object)

end

private
def should_perform? object
  Time.now.to_i > object.timestamp
end

或者,您可能希望使用标记(如dont_execute_until)标记对象,并将其用作传递给should_perform的参数。

只是一些想法:)

答案 3 :(得分:0)

面对这个问题时,我采取了一个非常简单的方法。 在我的 Ruby (Sinatra) 应用程序中,我设置了一个环境变量。它在我的 RACK 进程中是本地的。 在 perform_async 方法中,我有一个 [dangerous] 无限循环读取该 ENV 值。在我的 Sinatra 应用程序中,我定义了一个将该环境变量更改为其他内容的路由。这是一个简单的标志,让我的 Sidekiq 工作线程停止无限循环。

我真的希望这对某人有帮助。