はい、 send(..) メソッドは宛先キューにメッセージを送信します。そして、このメッセージは、プログラムがレシーバーを使用して受信するまで、またはメッセージブローカーが実行されるまで (私が知っているように)、キューに残ります。
2番目の質問について、2つのアプローチの違いは次のとおりです。
receive (..) メソッドは同期的です (これはこのアプローチの欠点です)。これは、メッセージが利用可能になるまで (またはタイムアウト条件が発生するまで) receive () メッセージがブロックされるため、受信者はメッセージが到着するまで辛抱強く待つ必要があることを意味します。リスナーでメッセージを消費する反対側からは、非同期プロセスです。受信者は待機しません。リスナーは、メッセージがクエリに送信されるときにのみ受信メソッドを呼び出します。
アップデート:
一時宛先は、コンシューマーによるメッセージの返信を送信するために使用されます。たとえば、サーバーがクライアントからメッセージを受け取り、クライアントに応答を送信する必要がある場合があります。そのような場合は、一時宛先を使用する必要があります。サーバー アプリケーションは、クライアントに応答メッセージを送信するために、この一時的な送信先 (この場合はキュー) を使用します。このようなキューには、それを作成した接続に限定されたスコープがあり、接続が閉じられるとすぐにサーバー側で削除されます。
詳細については、この記事と公式の Java チュートリアルを参照してください。2 番目の記事では、JMSCorrelationID をいつどのように使用するかについても説明します。
一時的な宛先を使用して応答メッセージを送信する方法を説明する公式ドキュメントの興味深い部分を次に示します。
一時的な宛先を使用して、単純な要求/応答メカニズムを実装できます。一時的な送り先を作成し、それをメッセージの送信時に JMSReplyTo メッセージ ヘッダー フィールドの値として指定すると、メッセージのコンシューマは、応答の送り先として JMSReplyTo フィールドの値を使用できます。コンシューマーは、応答メッセージの JMSCorrelationID ヘッダー フィールドを要求の JMSMessageID ヘッダー フィールドの値に設定することによって、元の要求を参照することもできます。たとえば、onMessage メソッドは、受信したメッセージに返信できるようにセッションを作成できます。次のようなコードを使用できます。
producer = session.createProducer(msg.getJMSReplyTo());
replyMsg = session.createTextMessage("Consumer " +
"processed message: " + msg.getText());
replyMsg.setJMSCorrelationID(msg.getJMSMessageID());
producer.send(replyMsg);
更新 2:
キュー (またはトピック) でのメッセージの有効期限について、回答を明確にしたいと思います。デフォルトでは、メッセージは期限切れになりません。ただし、メッセージの有効期限を設定できます。
producer.setTimeToLive(60000);
この後、この MessageProducer によって生成されたすべてのメッセージには、有効期限が指定されます。
また、送信中に具体的なメッセージの有効期限を指定できます。
producer.send(message, DeliveryMode.NON_PERSISTENT, 3, 10000);
ここで、10000 は 10 秒を意味します