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

この操作では、新しい 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.invoiceProcessorDestination]">
    <ibm-mq:message>
        <ibm-mq:reply-to destination="${completionEventsDestination}" destinationType="TOPIC"/>
    </ibm-mq:message>
</ibm-mq:publish>

相関 ID の伝播

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

最初に、​sendCorrelationId​ パラメーターを使用してメッセージをパブリッシュするときに ​correlationId​ を送信するかどうかを設定する必要があります。 このパラメーターは、​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>