2

ファイルをキューに入れるために、次の ActiveMq プログラムを実行しています。

public static void main(String[] args) throws JMSException, IOException {
    FileInputStream in;
    //Write the file from some location that is to be uploaded on ActiveMQ server

    in = new FileInputStream("d:\\test-transfer-doc-1.docx");
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                    "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://admin:admin@localhost:8161/fileserver/");
    ActiveMQConnection connection = (ActiveMQConnection) connectionFactory
                    .createConnection();
    connection.start();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Queue destination = session.createQueue("stream.file");
    OutputStream out = connection.createOutputStream(destination);

    // now write the file on to ActiveMQ
    byte[] buffer = new byte[1024];
    for (int bytesRead=0;bytesRead!=-1;) {
            bytesRead = in.read(buffer);
            System.out.println("bytes read="+bytesRead);
            if (bytesRead == -1) {
                out.close();
                System.out.println("Now existiong from prog");
                //System.exit(0);
                break;
            }
            else{
                System.out.println("sender\r\n");
                out.write(buffer, 0, bytesRead);
            }
    }
    System.out.println("After for loop");  
}

bytesRead == -1 の場合、タスクが完了したときにプログラムを JVM からアンロードしたいと考えています。この目的のために、最初にbreakキーワードを使用し、Eclipse コンソールで次の出力を生成しました。

ここに画像の説明を入力

これを使用すると、コンソールの赤いボタンがまだアクティブであるため、プログラムは JVM からアンロードされません。

この目的のために System.exit(0) を使用し、JVM からプログラムを終了しました。しかし、この目的で System.exit(0) を使用したくありません。代わりに単純な voidreturnも使用しようとしましbreakたが、それも機能しません。

この場合、プログラムを終了するために機能しない理由と、まだ実行されている理由breakを教えてください。return

よろしく、

アルン

4

4 に答える 4

5

リソース (キュー、入力ストリーム) はプログラムを存続させることができるため、それらを閉じる必要があります。その後、プログラムを終了するには単純なリターンで十分です。

于 2013-07-10T05:40:38.293 に答える
2

JVM がまだ残っている理由は、一部のユーザー スレッドがまだ完了していない可能性があります。予備調査から、あなたのセッションは内部的にスレッドを実行していると思います。切断する前に、セッションを停止して接続を閉じる必要があると思います。それはおそらくあなたの問題を解決するはずです。

于 2013-07-10T05:52:20.370 に答える
2

仕事に戻り、休憩します。問題は次のとおりですthat connection.start()。スレッドを開始し ([Active MQ Transport...] という名前でデバッグ モードで確認できます)、実行中の非デーモン スレッドが存在するまで、System.exit が呼び出されない限り、JVM は終了しません。

于 2013-07-10T05:50:19.583 に答える
1

JVM は、非デーモン スレッドが実行されている限り実行されます。したがって、上記のすべての人は正しいです。非デーモン スレッドがシャットダウンするように、すべてのリソースを閉じる必要があります。

于 2013-07-10T07:46:43.473 に答える