トピックサブスクリプションの使用

IBM MQ のトピックを使用すると、コンシューマの接続に関するサブスクリプションの動作と、コンシューマ間の相互動作を設定できます。

IBM MQ コネクタでは、consumer 操作と listener 操作の両方で topic-consumer 設定を使用して、トピックサブスクリプションのいろいろな側面を処理できます。

永続的サブスクリプションの登録

永続的サブスクリプションでは、コンシューマがオフラインのときにトピックにパブリッシュされたメッセージも受信できます。 永続的サブスクリプションが登録されると、コンシューマがオンラインになるたびに、接続の確立前にパブリッシュされていたすべてのメッセージを受信します。

<ibm-mq:consume config-ref="JMS_config" destination="#[vars.destination]">
    <ibm-mq:consumer-type>
        <ibm-mq:topic-consumer durable="true" subscriptionName="SampleSub"/>
    </ibm-mq:consumer-type>
</ibm-mq:consume>

IBM MQ は、キューに送信されたメッセージと同じように、トピックに対してパブリッシュされたメッセージを格納します。このアプリケーションや他のアプリケーションが同じ接続とクライアント ID、同じトピック、そして同じサブスクリプション名を使用して topic-consumer を 作成すると、サブスクリプションが再びアクティブとなり、IBM MQ はサブスクライバが非アクティブであったときにパブリッシュされたメッセージを配信します。

同じサブスクリプションでの複数のコンシューマの許可

JMS 1.1 では、トピックのサブスクリプションで同時に複数のコンシューマを有効にすることができなかったため、トピックサブスクリプションのメッセージ処理を共有できず、アプリケーションの拡張性を制限する要因となっていました。 JMS 2.0 では、共有サブスクリプション​の導入によって、この制限を撤廃しています。

IBM MQ コネクタを JMS 2.0 接続で設定​すると、任意の topic-consumershared サブスクリプションの一部として宣言できます。

<ibm-mq:listener config-ref="config" destination="InvoiceEventsTopic">
    <ibm-mq:consumer-type>
        <ibm-mq:topic-consumer shared="true" subscriptionName="ClusterSubscription"/>
    </ibm-mq:consumer-type>
</ibm-mq:listener>

この 2 つの異なる listener インスタンスに対する設定により、メッセージがインボイス宛先にパブリッシュされると、2 つのリスナのどちらかにのみ配信され、他方には配信されません。

自己パブリッシュメッセージの無視方法

アプリケーションがトピックにパブリッシュしたメッセージを、同じアプリケーションが受信しないようにしたいケースがあります。この場合は、topic-consumernoLocal パラメータを使用することにより、コンシューマが​同じ接続経由で​トピックにパブリッシュされたメッセージを受信しなくなります。

<ibm-mq:listener config-ref="config" destination="${notificationsChannel}">
    <ibm-mq:consumer-type>
        <ibm-mq:topic-consumer noLocal="true"/>
    </ibm-mq:consumer-type>
</ibm-mq:listener>

noLocal として設定されているコンシューマを shared サブスクリプションの一部に加えることは​できません​。

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub