我需要以编程方式停止Sidekiq(3.1.2)中正在运行的作业,而不是预定的作业。我已经阅读了API文档,但并没有找到有关取消正在运行作业的信息。这是否可能使用Sidekiq实现?
如果直接不可能实现,则我的想法是在调用信号时在作业中引发异常,然后从重试集中删除该作业。虽然这显然不是最佳方法。
提前致谢。
我需要以编程方式停止Sidekiq(3.1.2)中正在运行的作业,而不是预定的作业。我已经阅读了API文档,但并没有找到有关取消正在运行作业的信息。这是否可能使用Sidekiq实现?
如果直接不可能实现,则我的想法是在调用信号时在作业中引发异常,然后从重试集中删除该作业。虽然这显然不是最佳方法。
提前致谢。
正确,停止作业的唯一方法是让作业自行停止。您的应用程序必须实现这种逻辑。
https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job
setex
函数,作业的状态就会被设置为“已取消”,并停止执行。现在,当这个作业再次尝试运行时,那么return if cancelled?
部分有效地完成/结束了作业。这是正确的解释吗?@MikePerham - Masroor如果您知道长时间运行的作业的线程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
bundle exec ./pusher.rb ThreadLightly $YOURJOBSTHREADID
您需要记录每个作业的Thread.current.object_id,因为UI不会显示它。此外,如果您运行分布式sidekiqs,则需要运行此任务,直到它在同一实例上运行。
object_id.to_s(36)
。 - sigra停止正在运行的作业的另一种方法是停止 Sidekiq 进程。
并且停止Sidekiq进程需要一些时间。
如果Sidekiq进程停止,所有正在运行的作业将被重新定位到enqued
部分。因此,如果您重新启动Sidekiq进程,它将再次运行。
您需要删除所有在enqued部分的作业。您可以使用仪表板来完成,或者在Rails控制台上运行以下命令。
## queue_name = 'logger'
## Sidekiq::Queue.new(queue_name).each { |e| e.delete }
# e.g.
Sidekiq::Queue.new('logger').each { |e| e.delete }
或者... 使用仪表盘...
它将从所有作业队列中移除。 现在您可以重新启动您的Sidekiq进程。