2016-07-07 4 views
1

私は無限ループを持つTalendプロセスを持っています。私はこの無限ループをより制御可能な "while"ループに置き換えたいと思っています。私の考えは、whileループが内部変数(おそらくコンテキスト変数?)を監視し、UnixのSIGINTシグナルが捕捉されるとこの変数を設定することです。TalendプロセスがSIGINTを正しくキャッチする方法は?

これは可能ですか?はいの場合はどうですか?

実行可能な代替手段はありますか?私はセンチネルファイルで作業し、そのファイルがディスク上に見つかった場合にプロセスを停止することができますが、SIGINT処理はよりクリーンになります。

技術的には、TalendプロセスはJavaアプリケーションであり、これを正しく処理するためのJavaコードを書くために、Custon tJavaコンポーネントを使用する可能性があります。

私はtJavaコンポーネントを使用してシャットダウンフックを追加しようとしました

更新:falseに私のループ条件である私はcontext.keepRunningを設定しています。このコンポーネントでは、

Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
     System.out.println("Signal caught... finishing up current work and exiting."); 
     context.keepRunning = false; 
    } 
}); 

これは、シャットダウンフックでコンテンツを実行するだけでなく、すぐにプロセスを終了します。コントロールはTalendプロセスに戻されません。私はループコンポーネントの後に2つのtWarnコンポーネントを持っています。 1つはonSubjobOk、もう1つはonSubjobErrorです。どちらも、SIGINTまたはSIGTERM信号を送信した後は実行されません。しかし、シャットダウンフックのprintln文が実行されます。

+0

私がこれらのシグナルを理解する限り、彼らはあなたが参照しているスレッドで直接動作します。したがって、この信号をJavaに送信すると、Javaは直ちにそれを処理し、いつものように反応します。 *何かするための*追加の方法は 'addShutdownHook'です。それでも、どんな状態でも仕事は中断されます。 * tJava *または* tJavaRow *から使用可能なファイルまたはその他のものを使用します。 – tobi6

答えて

1

addShutdownHookからドキュメント:仮想マシンがシャットダウンシーケンスを開始すると、それは すべての登録済みシャットダウンフックを開始します

[..]。すべてのフックが終了すると、終了時のファイナライズが有効になっていれば、呼び出されていないファイナライザがすべて実行されます。最後に、仮想マシンは 停止します。

したがって、JVMはフックを開始し、フックの後のコードとtJavaの後のすべてのTalendコンポーネントは実行されません。

必要なものはシグナルハンドラであり、フックではありません。 this SO答えを参照してください。

関連する問題