所以我需要以编程方式停止Sidekiq(3.1.2)中的运行作业,而不是计划作业。我确实阅读了API文档,但没有找到任何关于取消正在运行的作业的信息。是否可以使用sidekiq?
当这不是直接可能的时候,我的想法是绕过这个,通过在调用信号时在作业中引发异常,然后从重试集中删除作业。这显然不是最佳选择。
提前致谢
答案 0 :(得分:10)
正确,停止工作的唯一方法就是让工作停止。您的应用程序必须实现该逻辑。
https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job
答案 1 :(得分:5)
如果您知道长时间运行的作业的线程ID,则可以从另一个任务中终止它:
class ThreadLightly
include Sidekiq::Worker
def perform(tid)
puts "I'm %s, and I'll be terminating TID: %s..." % [self.class, tid]
Thread.list.each {|t|
if t.object_id.to_s == tid
puts "Goodbye %s!" % t
t.exit
end
}
end
end
您可以从sidekiq_pusher:
触发它bundle exec ./pusher.rb ThreadLightly $YOURJOBSTHREADID
您需要记录每个作业的Thread.current.object_id,因为UI不会显示它。此外,如果您运行分布式sidekiqs,则需要运行此任务,直到它在同一个实例上运行。