2017-03-21 14 views
-2

背景にしても、最後の文の後に(バックグラウンドで)実行し続けJavaプログラムは、メイン

私は、STDの入力からデータを読み込み、単純なJavaプログラムを持っています。私はbashスクリプトexecuter.sh

python2 readLines.py | tee logfile | java MsgReader 

readLines.pyは、行毎にファイルからデータを読み込み、標準出力にそれを投げるから、しかし、それを実行しています

MsgReader.java

import kafka.javaapi.producer.Producer; 

public void process() { 
    String msg = ""; 
    BufferedReader stdinReader = new BufferedReader(new InputStreamReader(System.in) 

    Producer producer = new Producer();//it takes config file as parameter which is not related to the question here 

    try { 
     while ((msg = stdinReader.readLine()) != null) { 
       producer.send(message); 
     } 
     stdinReader.close(); 
    } catch (IOException|FailedToSendMessageException e) { 
      System.out.println("Send message failed!"); 
      e.printStackTrace(); 
    } 
} 

public static void main(String args[]) throws JSONException,IOException { 
    try{ 
     Date now = new Date(); 
     System.out.println("Start : " + now); 
     process();// Continuously reads logs 
     now = new Date(); 
     System.out.println("After : " + now); 
    } catch(Exception e){ 
     e.printStackTrace(); 
     return; 
    } 
} 

実行

./executer.sh &:すべての行readLines.py端を読んだ後、バックグラウンド

通報

で実行されるが、psコマンドによって確認としてexecuter.shMsgReader.javaはstll実行されます。ステートメントSystem.out.println("After : " + now);がログファイルに記録され、プログラムがmain関数の最後のステートメントに達したことを示します。

Javaプログラムとbashスクリプトを正常に終了する方法。

ここにSystem.exit()を追加しません。

プラットフォーム

CentOSの(最終)6.7をリリース

のJava 1.7.0_95

のpython 2.7.6

+1

'process'とは何ですか?かなり関連性があります。特に、おそらく非同期のタスク実行プログラムのように思えるからです。 [mcve]をチェックアウトすることを検討してください。 – CollinD

+0

pとは何ですか?コードを表示してください – Bohemian

+0

フォアグラウンドで実行するとどうなりますか? –

答えて

2

あなたはプロデューサーを閉じていませんでした。 KafkaProducerのJavadoc(Producerの実装)から:

プロデューサーはまだそのサーバだけでなく、バ​​ックグラウンドI/Oスレッドに送信されていないレコードを保持するバッファ・スペースのプールで構成されていこれらのレコードを要求に変換してクラスタに送信する役割を担います。使用後にプロデューサを閉じないと、これらのリソースがリークします。

バックグラウンドスレッドがまだ実行されていて、try/catch後、好ましくfinallyブロックで、Producerを閉じるまで終了からプロセスを防ぐことができます。また、stdinReader.close();finallyに属しています。

関連する問題