メッセージのパブリッシュ方法

この操作では、新しい JMS メッセージを作成して、指定した宛先 (キューまたはトピック) に送信できます。これにより、メッセージのコンテンツだけでなく、必要に応じてすべてのヘッダーを設定できます。

キューへのメッセージの送信

デフォルトの形式で使用された場合、コネクタによってメッセージペイロード内のすべての内容がパブリッシュされます。

<jms:publish destination="invoiceQueue" config-ref="JMS_config"/>

しかし、ペイロードが正しい形式でなく、実際に変換を行う必要がある場合にはどうでしょうか? この場合は、publish 操作の前に DataWeave トランスフォーマを配置できますが、メッセージのペイロードが変更されるため、publish に続く操作に影響が出ることがあります。

この不要な影響を回避するには、publish 操作の内部にトランスフォーマを配置します。

<jms:publish destination="invoiceQueue" config-ref="JMS_config">
  <jms:message>
    <jms:body>#[%dw 2.0
   output application/json
   ---
   payload.payments
   ]</jms:body>
  </jms:message>
</jms:publish>

これで、トランスフォーマによってパブリッシュされるコンテンツが生成される一方で、送信中のメッセージに対する副作用は発生しません。

トピックへのメッセージのパブリッシュ

メッセージを任意のトピック宛先にパブリッシュするために publish 操作を使用することもできます。 操作とメッセージの設定はすべて同じですが、destinationType パラメータで宛先を TOPIC として宣言する必要があります。

上記の同じ例で、メッセージをキューに送信する代わりにトピックにパブリッシュするには、次の操作を実行します。

<jms:publish destination="invoiceEvents" destinationType="TOPIC" config-ref="JMS_config">
  <jms:message>
    <jms:body>#[%dw 2.0
   output application/json
   ---
   payload.payments
   ]</jms:body>
  </jms:message>
</jms:publish>

メッセージ配信のカスタマイズ

各 JMS メッセージにはヘッダーがあり、メッセージの存続期間や優先度などのメタデータを渡すことができます。パブリッシュされるメッセージに関するメタデータは、publish 操作のパラメータで設定できます。

優先キューの実装

優先キューを実装するには、一部のメッセージに対して、デフォルト以外の優先度を割り当てる必要があります。これは、操作で priority パラメータを使用して行います。

<jms:publish priority="#[attributes.queryParams.priority]" destination="priorityQueue" config-ref="JMS_config"/>

メッセージの存続期間の制御方法

パブリッシュされるすべての JMS メッセージには、メッセージがコンシューム可能な状態を維持する存続期間を宣言した timeToLive ヘッダーがあり、この期間が過ぎるとメッセージは削除されます。publish 操作の timeToLive パラメータおよび timeToLiveUnit パラメータにより、パブリッシュされる各メッセージの JMS ヘッダーの値を設定できます。

<jms:publish  timeToLive="#[vars.timeToLive]" timeToLiveUnit="SECONDS"
              destination="#[vars.destination]" config-ref="JMS_config"/>

JMS 2.0 を使用している場合は、メッセージの deliveryDelay を設定することで、メッセージがコンシューマに公開されるまでの待ち時間を設きます。

<jms:publish  deliveryDelay="${msgInitialDelay}" deliveryDelayUnit="MILLISECONDS"
              destination="#[vars.destination]" config-ref="JMS_config"/>

応答宛先の宣言

送信するメッセージに対する非同期の応答が必要な場合は、JMS の publish 操作で任意の reply-to 宛先を宣言できます。この宛先は、JMS ヘッダーとしてメッセージのコンシューマに通信され、返信が送信される場合は、その宛先となります。

reply-to 宛先を宣言するには、次のようにメッセージの定義に追加します。

<jms:publish config-ref="JMS_config" destination="#[vars.invoceProcessorDestination]">
    <jms:message>
        <jms:reply-to destination="${completionEventsDestination}" destinationType="TOPIC"/>
    </jms:message>
</jms:publish>

相関 ID の伝播

publish 操作では、送信メッセージの correlationId を設定できます。

最初に、sendCorrelationId パラメータを使用してメッセージをパブリッシュするときに correlationId を送信するかどうかを設定する必要があります。このパラメータは、ALWAYS (常にヘッダーを送信する)、NEVER (ヘッダーを送信しない)、または AUTO (デフォルト、アプリケーション設定を使用する) に設定できます。 次に、メッセージを送信するイベントの correlationId を使用するか、またはメッセージビルダーでカスタム correlationId を設定できます。

<jms:publish config-ref="JMS_config" sendCorrelationId="ALWAYS" destination="#[attributes.headers.replyTo.destination]">
    <jms:message correlationId="#[attributes.headers.correlationId]"/>
</jms:publish>

メッセージプロパティの設定

すべての JMS メッセージではプロパティを設定できます。プロパティには、他のメッセージングシステムとの互換性を指定したり、カスタムメッセージセレクタを作成したりと、いろいろな使い道があります。 これらのプロパティの中にはよく知られた JMS 規格もありますが、実装またはカスタムユーザ設定に応じて異なるものもあります。publish 操作により、メッセージでこのすべてのプロパティを直接設定できます。

ユーザプロパティの設定

送信メッセージのプロパティを設定するのに必要な作業は、メッセージ内で properties 要素を使用して、DataWeave でマップのインライン宣言を行うだけです。

<jms:publish config-ref="JMS_config" destination="${bridgeDestination}" destinationType="TOPIC">
    <jms:message>
        <jms:body>#["bridged_" ++ payload]</jms:body>
        <jms:properties>#[{
            AUTH_TYPE: 'jwt'
            AUTH_TOKEN: attributes.queryParams.token
        }]</jms:properties>
    </jms:message>
</jms:publish>

JMSX プロパティの設定

JMSX プロパティは、JMS 仕様で定義されているよく知られたプロパティセットで、メッセージに関するメタデータを指定します。これらのプロパティを設定するには、メッセージ要素の一部としてインラインで宣言します。

<jms:publish config-ref="JMS_config" destination="${bridgeDestination}" destinationType="TOPIC">
    <jms:message>
        <jms:body>#["bridged_" ++ payload]</jms:body>
        <jms:jmsx-properties jmsxGroupID="#[vars.currentGroup]" jmsxUserID="${username}"/>
    </jms:message>
</jms:publish>

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub