2

次のように簡単なプログラムを作成ActiveMQします。

    public static void main(String[] args) throws Throwable
    {
        final ActiveMQConnectionFactory conFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        final QueueConnection connection = conFactory.createQueueConnection();
        final Session session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
        final Destination destination = new ActiveMQQueue("MJ_SAF");
        final MessageProducer producer = session.createProducer(destination);

        Message message = session.createTextMessage("test");
        message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 20);
        message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 1);
        message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 1);
        producer.send(message);
}

このプログラムを実行すると、メッセージはActiveMQブローカーに適切に送信されますが、プログラムは終了せず、実行され続けます。上記のプログラムの最後にステートメントを追加するconnection.close();と、プログラムが完了して正常に終了します。

私の質問は次のとおりです。この動作の理由は何ですか?

4

1 に答える 1

2

開いている接続がある限り、これらの接続との間でメッセージの読み取りと書き込みを処理する (AMQ によって) 割り当てられたスレッドが VM を実行し続けます (これらはデーモン スレッドではありません)。

プログラムのデバッグ時にスレッドを確認できます。

于 2013-02-18T07:07:52.853 に答える