次のモジュールを作成して、私のDelayed Jobワーカーに時折送られるをキャプチャし、term_now
という変数を設定して、完了する前にジョブを正常終了させます。私のブロック/利回りは変化する変数をどのように通過させることができますか?
自分の仕事にインラインで入れると、次のコードがうまく機能しますが、私はそれを複数のジョブに必要とし、モジュールに入れると機能しません。
term_now
を1回だけ偽(falseの場合)し、trueを返しても再びそれを渡さないので、動作しないと仮定します。したがって、ジョブは決して停止しません。
module StopJobGracefully
def self.execute(&block)
begin
term_now = false
old_term_handler = trap('TERM') do
term_now = true
old_term_handler.call
end
yield(term_now)
ensure
trap('TERM', old_term_handler)
end
end
end
ここでは通常使われていますどのように取り組んでインラインコードは(これは私がモジュールに変換しようとしているコードです)です:
class SMSRentDueSoonJob
def perform
begin
term_now = false
old_term_handler = trap('TERM') do
term_now = true
old_term_handler.call
end
User.find_in_batches(batch_size: 1000) do
if term_now
raise 'Gracefully terminating job early...'
end
# do lots of complicated work here
end
ensure
trap('TERM', old_term_handler)
end
end
end
ありがとうございます - 私はそれを試してみます – Tallboy