メッセージのパブリッシュと応答のリスン

要求と応答はアプリケーション間で非常に一般的なパターンであるため、JMS コネクタには専用の publish-consume​ 操作が用意されています。 publish-consume​ 操作により、メッセージを任意の宛先にパブリッシュし、別の宛先で応答を待機することができます。

この操作を使用する場合、送信メッセージの JMSReplyTo ヘッダーにはアプリケーションが応答を待機する宛先の ID が含まれます。この宛先には、既知の宛先を使用できます。また、1 つの応答メッセージを受け取ることを目的として一時的に作成された宛先を使用できます。

最後に、操作の結果として、consume​ 操作を呼び出した場合と同じ構造のメッセージが応答として受信されます。

一時キューでの応答の待機

一時キューを使用して応答を待機するための設定は非常にシンプルで、送信するメッセージを設定するだけで、操作は自動的に一時キューで応答を待ちます。

<jms:publish-consume
doc:name="Publish consume"
doc:id="facb4f6a-5796-4d62-9052-64258dfd8639"
config-ref="config"
destination="targetDestination">
	<jms:consume-configuration maximumWait="20" maximumWaitUnit="SECONDS" />
</jms:publish-consume>

この例の操作では、現在の payload​ を 本文とし、JMSReplyTo header​ を一時的な宛先に設定したメッセージを targetDestination​ にパブリッシュします。 その後、メッセージがコンシュームされるか、maximumWait​ 時間が経過するまで (この場合は JMS:TIMEOUT​ エラーで失敗します)、一時キューから自動的に応答のコンシュームを試みます。

既知のキューでの応答の受信

多くの場合、要求ごとに作成されるキューに応答を送信することは望まれません。代わりによく知られたキューを応答で使用します。この場合、自分で実行するのは、送信メッセージで reply-to​ パラメータを設定することだけです。

<jms:publish-consume config-ref="config" destination="targetDestination">
    <jms:message>
        <jms:reply-to destination="replyToDestination"/>
    </jms:message>
</jms:publish-consume>

これで、この操作では、現在の payload​ を本文とし、replyToDestination​ で JMSReplyTo​ ヘッダーを設定したメッセージが targetDestination​ にパブリッシュされるようになります。 その後、メッセージがコンシュームされるか、maximumWait​ 時間が経過するまで (この場合は JMS:TIMEOUT​ エラーで失敗します)、replyToDestination​ キューから自動的に応答のコンシュームを試みます。

要求応答パターン

JMS コネクタ 1.6.0 以降

JMS には、要求メッセージと応答メッセージの相関方法を示すよく知られた要求応答パターンが 2 つあります。こにより、受信したメッセージが出力メッセージの正しい応答であることが保証されます。

相関 ID パターン

このパターンは、Publish Consume​ 操作のデフォルトです。このパターンを使用すると、宛先キューにメッセージをパブリッシュした後の操作で、要求メッセージのパブリッシュに使用する相関 ID と同じ相関 ID を持つメッセージを期待するセレクタを使用して、メッセージがコンシュームされます。

クライアントおよびリスナの JMS 相関 ID パターンの実装
<flow name="publish-consume-correlation-id">
  <jms:publish-consume config-ref="config" destination="targetDestination" requestReplyPattern="CORRELATION_ID">
    <jms:message >
      <jms:reply-to destination="replyToDestination" />
    </jms:message>
  </jms:publish-consume>
  <logger message="Received message from 'replyToDestination' with Correlation ID: #[attributes.headers.correlationId]"/>
</flow>

<flow name="jms-listener-correlation-id" >
  <jms:listener config-ref="config" destination="targetDestination">
    <jms:response requestReplyPattern="CORRELATION_ID" />
  </jms:listener>
  <logger level="INFO" message="About to reply to 'targetDestination' with Correlation ID: #[attributes.headers.correlationId]"/>
</flow>

メッセージ ID パターン

メッセージ ID パターンは相関 ID パターンとは異なります。このパターンでは、宛先キューにメッセージをパブリッシュした後の操作で、要求メッセージのメッセージ ID と同じ値の相関 ID を持つメッセージを期待するセレクタを使用して、メッセージがコンシュームされます。

クライアントおよびリスナの JMS メッセージ ID パターンの実装
<flow name="publish-consume-message-id">
  <jms:publish-consume config-ref="config"
    destination="targetDestination"
    requestReplyPattern="MESSAGE_ID">
    <jms:message >
      <jms:reply-to destination="replyToDestination" />
    </jms:message>
  </jms:publish-consume>
  <logger message="Received message from 'replyToDestination' with Correlation ID: #[attributes.headers.correlationId]"/>
</flow>

<flow name="jms-listener-message-id" >
  <jms:listener config-ref="config" destination="targetDestination">
    <jms:response requestReplyPattern="MESSAGE_ID" />
  </jms:listener>
  <logger level="INFO" message="About to reply to 'targetDestination' with Correlation ID: #[attributes.headers.messageId]"/>
</flow>

なし

上記のどのパターンも使用しないように操作を設定することもできます。この場合、コンシューマはセレクタを使用してメッセージを相関するのではなく、応答キューからコンシュームを試みます。

確実に 1 つのメッセージのみが含まれる一時キューを使用して作業する場合は、このオプションが役立ちます。

Was this article helpful?

💙 Thanks for your feedback!