JMS Connector を使用したメッセージのパブリッシュと応答のコンシューム

JMS 用 Anypoint Connector (JMS Connector) の ​Publish consume​ 操作では、指定した任意の宛先にメッセージをパブリッシュした後、指定した異なる宛先でメッセージ応答をコンシュームできます。要求と応答はアプリケーション間で非常に一般的なパターンです。

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

操作の結果として、​Consume​ 操作の呼び出しで使用された構造と同じ構造を持つ応答メッセージが受信されます。

一時キューでの応答の受信

一時キューを設定するには、送信するメッセージを設定します。これで操作は応答を自動的に待機します。

次の例では、次の特性を使用して、メッセージをパブリッシュするように ​Publish consume​ 操作を設定します。

  • 現在の ​payload​ をその本文とする

  • JMSReplyTo​ ヘッダーを一時的な宛先に設定する

  • [Destination (宛先)]​ 項目を ​targetDestination​ に設定する

これで、この操作では、メッセージがコンシュームされるか、​[Maximum wait (最大待機)]​ に達するまで (この場合は ​JMS:TIMEOUT​ エラーで失敗します)、一時キューから応答のコンシュームを自動的に試みます。

操作を設定する手順は、次のとおりです。

  1. Studio フローで、​[Publish consume]​ 操作を選択します。

  2. コネクタの設定画面で、​[Destination (宛先)]​ 項目を ​targetDestination​ に設定します。

  3. [Consume Configuration (コンシューム設定)]​ セクションまでスクロールダウンして、​[Maximum wait (最大待機)]​ 項目を ​20​ に設定します。

  4. [Maximum wait unit (最大待機単位)]​ を ​SECONDS​ に設定します。

「Publish consume」 設定画面で [Destination (宛先)] 項目を、メッセージの送信先である宛先の名前に設定する
Figure 1. 一時キューの設定

XML エディターでは、​destination​ および ​<jms:consume-configuration>​ 設定は次のように記述されます。

<jms:publish-consume
doc:name="Publish consume"
config-ref="config"
destination="targetDestination">
	<jms:consume-configuration maximumWait="20" maximumWaitUnit="SECONDS" />
</jms:publish-consume>

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

応答用の既知のキューを設定するには、送信メッセージで ​[Reply To (応答先)]​ 項目を設定します。

次の例では、次の特性を使用して、メッセージを ​targetDestination​ にパブリッシュするように ​Publish consume​ 操作を設定します。

  • 現在の ​payload​ をその本文とする

  • JMSReplyTo​ ヘッダーを既知のキューに設定する

  • [Reply To (応答先)]​ 項目を ​replyToDestination​ に設定する

これで、この操作では、メッセージがコンシュームされるか、​[Maximum wait (最大待機)]​ に達するまで (この場合は ​JMS:TIMEOUT​ エラーで失敗します)、既知の ​replyToDestination​ キューから応答のコンシュームを自動的に試みます。

操作を設定する手順は、次のとおりです。

  1. Studio フローで、​[Publish consume]​ 操作を選択します。

  2. コネクタの設定画面で、​[Destination (宛先)]​ 項目を ​targetDestination​ に設定します。

  3. [Message (メッセージ)]​ セクションで ​[Reply To (応答先)]​ 項目を ​[Edit inline (インライン編集)]​ に設定します。

  4. [Destination Name (宛先名)]​ 項目を ​replyToDestination​ に設定します。

  5. [Consume Configuration (コンシューム設定)]​ セクションまでスクロールダウンして、​[Maximum wait (最大待機)]​ 項目を ​20​ に設定します。

  6. [Maximum wait unit (最大待機単位)]​ を ​SECONDS​ に設定します。

「Publish consume」 設定画面で、「Reply To (応答先)」 項目を設定する メッセージの応答先である宛先の JMSReplyTo ヘッダー情報
Figure 2. 既知のキューの設定

XML エディターでは、​destination​ および ​<jms:reply-to>​ 設定は次のように記述されます。

<jms:publish-consume config-ref="config" destination="targetDestination">
    <jms:message>
        <jms:reply-to destination="replyToDestination"/>
    </jms:message>
			<jms:consume-configuration maximumWait="20" maximumWaitUnit="SECONDS" />
</jms:publish-consume>

要求および応答パターンの設定

JMS では、要求メッセージと応答メッセージの相関方法を理解するのに役立つよく知られた 2 つの要求および応答パターンを使用します。操作の ​[Request-Reply Pattern (要求-応答パターン)]​ 項目で、​CORRELATION_ID​ (デフォルト)​ および ​MESSAGE_ID​ パターンを設定できます。どちらのパターンでも、受信メッセージが送信メッセージへの正しい応答であることが保証されます。 この項目を ​[NONE (なし)]​ に設定することもできます。この場合、コンシューマーはセレクターを使用してメッセージを相関するのではなく、応答キューからコンシュームを試みます。確実に 1 つのメッセージのみが含まれる一時キューを使用して作業する場合は、このオプションが役立ちます。

相関 ID パターンの設定

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

次の例の最初のフローでは、次の特性を使用して、メッセージを ​targetDestination​ にパブリッシュするように ​Publish consume​ 操作を設定します。

  • 現在の ​payload​ をその本文とする

  • JMSReplyTo​ ヘッダーを既知のキューに設定する

  • [Reply To (応答先)]​ 項目を ​replyToDestination​ に設定する

  • [Request-Reply Pattern (要求-応答パターン)]​ 項目を ​CORRELATION_ID​ (デフォルト)​ に設定する

次に、2 番目のフローの ​On New Message​ ソースで、パブリッシュされたメッセージを読み取り、同じ相関 ID パターンを使用して応答します。​Logger​ コンポーネントでメッセージ応答を記録します。
最初のフローに戻り、​Publish consume​ 操作で受信した応答をコンシュームしたら、別の ​Logger​ コンポーネントで最終メッセージを記録します。

操作を設定する手順は、次のとおりです。

  1. Studio フローで、​[Publish consume]​ 操作を選択します。

  2. コネクタの設定画面で、​[Destination (宛先)]​ 項目を ​targetDestination​ に設定します。

  3. [Request-Reply Pattern (要求-応答パターン)]​ を ​CORRELATION_ID​ (デフォルト)​ に設定します。

  4. [Message (メッセージ)]​ セクションで ​[Reply To (応答先)]​ 項目を ​[Edit inline (インライン編集)]​ に設定します。

  5. [Destination Name (宛先名)]​ 項目を ​replyToDestination​ に設定します。

  6. [Logger]​ コンポーネントを [Publish consume] の右にドラッグします。

  7. [Message (メッセージ)]​ 項目を ​Received message from 'replyToDestination' with Correlation ID: #[attributes.headers.correlationId]​ に設定します。

  8. JMS の ​[On New Message]​ ソースを最初のフローの下にドラッグします。

  9. [Destination (宛先)]​ 項目を ​targetDestination​ に設定します。

  10. [Response (応答)]​ セクションまでスクロールダウンして、​[Request-Reply Pattern (要求-応答パターン)]​ を ​CORRELATION_ID​ (デフォルト)​ に設定します。

  11. 別の ​[Logger]​ コンポーネントを ​[On New Message]​ の右にドラッグします。

  12. [Message (メッセージ)]​ 項目を ​About to reply to 'targetDestination' with Correlation ID: #[attributes.headers.correlationId]​ に設定します。

「Request-Reply Pattern (要求-応答パターン)」 を 「CORRELATION_ID (Default)」 に設定する
Figure 3. 相関 ID パターンの実装

XML エディターでは、​requestReplyPattern​ 設定は次のように記述されます。

<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 パターンの設定

MESSAGE_ID​ パターンを使用すると、宛先キューにメッセージをパブリッシュした後の操作で、要求メッセージのメッセージ ID と同じ値のメッセージ ID を持つメッセージを期待するセレクターを使用して、メッセージがコンシュームされます。メッセージ ID は、プロバイダーが送信した各メッセージを一意に識別する値です。

次の例の最初のフローでは、次の特性を使用して、メッセージを ​targetDestination​ にパブリッシュするように ​Publish consume​ 操作を設定します。

  • 現在の ​payload​ をその本文とする

  • JMSReplyTo​ ヘッダーを既知のキューに設定する

  • [Reply To (応答先)]​ 項目を ​replyToDestination​ に設定する

  • [Request-Reply Pattern (要求-応答パターン)]​ 項目を ​MESSAGE_ID​ に設定する

次に、2 番目のフローの ​On New Message​ ソースで、パブリッシュされたメッセージを読み取り、同じメッセージ ID パターンを使用して応答します。​Logger​ コンポーネントでメッセージ応答を記録します。
最初のフローに戻り、​Publish consume​ 操作で受信した応答をコンシュームしたら、別の ​Logger​ コンポーネントで最終メッセージを記録します。

操作を設定する手順は、次のとおりです。

  1. Studio フローで、​[Publish consume]​ 操作を選択します。

  2. コネクタの設定画面で、​[Destination (宛先)]​ 項目を ​targetDestination​ に設定します。

  3. [Request-Reply Pattern (要求-応答パターン)]​ を ​MESSAGE_ID​ に設定します。

  4. [Message (メッセージ)]​ セクションで ​[Reply To (応答先)]​ 項目を ​[Edit inline (インライン編集)]​ に設定します。

  5. [Destination Name (宛先名)]​ 項目を ​replyToDestination​ に設定します。

  6. [Logger]​ コンポーネントを ​[Publish consume]​ の右にドラッグします。

  7. [Message (メッセージ)]​ 項目を ​Received message from 'replyToDestination' with Message ID: #[attributes.headers.correlationId]​ に設定します。

  8. JMS の ​[On New Message]​ ソースを最初のフローの下にドラッグします。

  9. [Destination (宛先)]​ 項目を ​targetDestination​ に設定します。

  10. [Response (応答)]​ セクションまでスクロールダウンして、​[Request-Reply Pattern (要求-応答パターン)]​ を ​MESSAGE_ID​ に設定します。

  11. 別の ​[Logger]​ コンポーネントを ​[On New Message]​ の右にドラッグします。

  12. [Message (メッセージ)]​ 項目を ​About to reply to 'targetDestination' with Message ID: #[attributes.headers.messageId]​ に設定します。

「Request-Reply Pattern (要求-応答パターン)」 を 「MESSAGE_ID」 に設定する
Figure 4. メッセージ 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 Message ID: #[attributes.headers.messageId]"/>
</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 Message ID: #[attributes.headers.messageId]"/>
</flow>