2016-10-30 10 views
1

次のモジュールを作成して、私の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 

答えて

2

あなたは基本的に自分で答えました。指定したコード例のterm_nowは、yieldが呼び出される前にトラップがスナップされた場合にのみtrueになります。

あなたがしなければならないことは、定期的に情報を取得するメカニズムを提供することです。つまり、find_in_batchesの実行内でチェックすることができます。

結果を生成する代わりに、モジュールにterm_nowメソッドがあり、インスタンス変数@term_nowを返す必要があります。

+0

ありがとうございます - 私はそれを試してみます – Tallboy

関連する問題