web-dev-qa-db-ja.com

Sidekiqは、実行中の1つのジョブを停止します

したがって、スケジュールされたジョブではなく、プログラムでSidekiq(3.1.2)のrunningジョブを停止する必要があります。 APIドキュメントを読みましたが、実行中のジョブのキャンセルについては何も見つかりませんでした。これはsidekiqで可能ですか?

これが直接不可能な場合、シグナルを呼び出すときにジョブで例外を発生させ、再試行セットからジョブを削除することで、これを回避することを考えました。ただし、これは明らかに最適ではありません。

前もって感謝します

15
Figedi

正解です。ジョブを停止する唯一の方法は、ジョブ自体を停止することです。アプリケーションはそのロジックを実装する必要があります。

https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job

10
Mike Perham

長時間実行されているジョブのスレッド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を実行する場合は、同じインスタンスで実行されるまでこのタスクを実行する必要があります。

5
AXE-Labs