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

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

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

デフォルトでは、コネクタはペイロードに含まれるすべての内容をパブリッシュします。

<ibm-mq:publish destination="invoiceQueue" config-ref="IBM_MQ_config"/>

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

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

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

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

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

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

上記と同じ例で、メッセージをキューに送信するのではなくトピックにパブリッシュするには、次のように定義します。

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

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

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

優先キューの実装

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

<ibm-mq:publish priority="#[attributes.queryParams.priority]" destination="priorityQueue" config-ref="IBM_MQ_config"/>

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

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

<ibm-mq:publish  timeToLive="#[vars.timeToLive]" timeToLiveUnit="SECONDS"
              destination="#[vars.destination]" config-ref="IBM_MQ_config"/>

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

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

応答宛先の宣言

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

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

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

相関 ID の伝播

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

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

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

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

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

ユーザプロパティの設定

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

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

JMSX プロパティの設定

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

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

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub