我想取消工人的执行。
我有这份工作,例如:
#<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工作人员?
答案 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 工作线程停止无限循环。
我真的希望这对某人有帮助。