したがって、スケジュールされたジョブではなく、プログラムでSidekiq(3.1.2)のrunningジョブを停止する必要があります。 APIドキュメントを読みましたが、実行中のジョブのキャンセルについては何も見つかりませんでした。これはsidekiqで可能ですか?
これが直接不可能な場合、シグナルを呼び出すときにジョブで例外を発生させ、再試行セットからジョブを削除することで、これを回避することを考えました。ただし、これは明らかに最適ではありません。
前もって感謝します
正解です。ジョブを停止する唯一の方法は、ジョブ自体を停止することです。アプリケーションはそのロジックを実装する必要があります。
https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job
長時間実行されているジョブのスレッド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
UIに表示されないため、各ジョブのThread.current.object_idをログに記録する必要があります。また、分散sidekiqを実行する場合は、同じインスタンスで実行されるまでこのタスクを実行する必要があります。