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

JMS のトピックにより、コンシューマの接続に関するサブスクリプションの動作に加えて、このコンシューマが相互にやり取りする方法を設定することもできます。

Mule の JMS コネクタを使用すると、consumer 操作と listener 操作の両方で 'topic-consumer' 設定を使用するトピックサブスクリプションの側面を扱うことができます。

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

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

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

その後、JMS プロバイダはキューに送信されたメッセージを保存するため、トピックに送信またはパブリッシュされたメッセージを保存します。このアプリケーションまたは別のアプリケーションによって同じ接続およびそのクライアント ID、同じトピック、同じサブスクリプション名を使用して 'topic-consumer' が作成された場合、そのサブスクリプションは再アクティブ化され、JMS プロバイダはサブスクライブが非アクティブだった期間中にパブリッシュされたメッセージを配信します。

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

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

JMS コネクタが JMS 2.0 接続を使用して設定されている場合​、shared サブスクリプションの一部として 'topic-consumer' を宣言できます。

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

2 つの異なる listener インスタンスでこの設定を行うことで、メッセージが請求書の宛先にパブリッシュされた場合、一方のリスナにのみ配信され、もう一方には配信されません。

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

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

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

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

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub