2016-04-28 12 views
4

現在のキューのコンシューマから別のキューにメッセージを送信することは合法で安全ですか?Java/Spring - コンシューマからRabbitMQメッセージを送信する

public void onMessage(){ 
    //save to db 
    Order o=myservice.create(order); 

    Object o=rabbitTemplate.convertSendAndReceive(queue2,orderId); 
} 

私はトランザクションが唯一のonMessageメソッドの終了後にコミットされますので、この場合、第2のキューの消費者が保存された順番が表示されないかもしれないと思います。

消費者からメッセージを送信することは安全で合法ですか?

+0

プロデューサ - >コンシューマ - >アプリケーション - >プロデューサ - >コンシューマのような問題はありません。 –

答えて

2

はい、完全に合法で安全です。rabbitmqまたはamqp側から見てください。

しかし、ビジネスアプリケーションが処理しているデータの一貫性は安全です。それは別の話です。消費者メッセージMは、DBは、(例えば)を書き込むためにそれからSにいくつかのデータを抽出し、同じ時間内にデータを書き込む必要性を受けていることを消費者BにMメッセージを転送受信した場合DBですが、このデータはで、にあります。Sの場合はどうなりますか?まあ、チャンスはランダムであり、これは競合状態として知られている - この場合には、はブローカーをレースされた - それはBがメッセージMを受け取る前にDBへSを書き込む必要があります。
レースを避ける最良の方法は、レースを避けることです。 にメッセージを転送すると、の後にのみ、他のコンシューマの「再生を設定する」が完了しています。

関連する問題