HornetQをJMSプロバイダー(キュー)として使用してjmsサーバーをセットアップしました。
プロデューサーとして機能するアプリケーションと、コンシューマーとして機能する別のアプリケーション(別のコンピューター)があります。
JMS仕様が配信の順序を保証しないことは理解していますが、それを行う方法を探しています。プロバイダー固有であっても、送信された順序でメッセージを正確に受信します。
何か案は?
どうやらこれは、コンシューマキャッシュを無効にすることで実現できます。これは、hornetq-jms.xml
:を変更することによって行われます。
<connection-factory name="ConnectionFactory">
<connectors>
<connector-ref connector-name="netty-connector"/>
</connectors>
<entries>
<entry name="ConnectionFactory"/>
</entries>
<consumer-window-size>0</consumer-window-size> <!-- add this line -->
</connection-factory>
実際、JMS仕様のセクション4.4.10.2(メッセージ送信の順序)は、順序についてかなり明確です。
単一のプロデューサーがあり、キューまたはトピックサブスクリプションに対して単一のコンシューマーがある場合、メッセージの順序は、再配信が存在する場合でも常に保証されます。
複数のコンシューマーがある場合、ロールバックまたはコンシューマーのクローズの場合にクライアントバッファーが再配信され、クライアントバッファーが順序どおりに配信されないことがあります。
HornetQには、生成されたメッセージに追加の順序制約を与えるメッセージグループもあります。