2016-04-11 11 views
0

私のプロジェクトでJMSキューを実装しています.1つのトランザクションで100個のメッセージを送信していますが、キューに入れる前にDB操作を実行しています。すなわちJMSキューに送信する前にメッセージをコミットします

//SuedoCode 

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void sendMsg(List orders) 
{ 
    for(Order order : orders) 
    { 
    order.setStatus("SENT"); 
    sendToQueue(order); 
    } 

} 

このトランザクションはコミットされず、受信者は送信者のトランザクションがコミットされる前に注文を受け取ります。受信者はメッセージを処理し、ステータスを再度変更してからコミットしますが、送信者のトランザクションがコミットした後、発生してはならないステータスが上書きされます。したがって、私は注文のステータスを変更する方法を持っており、送信中ステータスが変更されているので、しかし、何らかのエラーが発生した場合、このメソッドはREQUIRES_NEWトランザクション内にある(スプリングプロキシの)新しいクラスを作成し、この問題を解決するために

メッセージを待ち行列に入れた後、ステータスを変更する必要があります(前のトランザクションがすでにコミットされているため)。 私に示唆してください。このアプローチが正しかったり、より良いことができれば。 ありがとうございます。

答えて

0

キューに入れられたメッセージは、すべてが一度にコミットされるように、同じトランザクションの一部である必要があります。

他の解決方法は、更新された注文をリストに格納し、トランザクションがコミットされ、データベースが更新されるとすぐにこのメソッドの外でsendToQueueを呼び出すことです。

関連する問題