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

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

IBM MQ Connector では、​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 Connector を ​JMS 2.0 接続で設定​すると、任意の ​topic-consumer​ を ​shared​ サブスクリプションの一部として宣言できます。

<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-consumer​ で ​noLocal​ パラメーターを使用することにより、コンシューマーが​同じ接続経由で​トピックにパブリッシュされたメッセージを受信しなくなります。

<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​ サブスクリプションの一部に加えることは​できません​。