JMS メッセージの送信を伴うプロセスがあります。このプロセスはトランザクションの一部です。トランザクションの後半部分 (メッセージを送信した前の部分の後の部分) が失敗した場合、メッセージをキャンセルする必要があります。私が考えていたことの 1 つは、メッセージを一定時間ピックアップしないように何らかの方法で設定することでした。ロールバックする必要がある場合は、メッセージをキャンセルすることができます。メッセージを知らないので、そのアイデアが可能かどうかわかりません。または、より良いアイデアはありますか?ありがとう
2 に答える
JMS と JTA (Java Transaction API) を併用できます。その場合、JMS メッセージの送信または受信メッセージの消費は、実際にはトランザクション コミットの一部としてアトミックに発生します。
これは何を意味するのでしょうか?トランザクションが失敗するかロールバックされた場合、「送信済み」メッセージは送信されず、「受信済み」メッセージは実際には消費されません。JMS および JTA プロバイダーによってすべてが処理されます。
JTA をサポートする JMS 実装を使用する必要があります。すでにトランザクションを使用しているように聞こえるので、それを実現するためにいくつかの構成を行うことが問題になるかもしれません (力強く手を振って...)。
これを使用した経験があります(BEA WebLogic 7 w / BEA WebLogic Integration)。宣伝どおりに機能しました -- 「外の世界」では、トランザクションが正常にコミットされない限り、私が試した JMS の影響は見られませんでした。
これの以前のバージョンは、JMS/JTA 統合全般について説明している Java ページにリンクされていました。ページが古くなり、同等の代替品が見つかりません。このjavadocは、この機能に関連する JMS インターフェース用です。
あなたが説明したのは XA トランザクションです。これにより、JMS プロバイダー、DB、またはその他の EIS など、複数のレイヤーにわたってトランザクションのスコープを設定できます。ほとんどのコンテナーは、非 XA トランザクションと非 XA トランザクションの両方を使用するように構成できるため、コンテナーの設定を確認してください。
たとえば、XA トランザクションで JMS を使用している場合、次のことが可能です。
Start Transaction
|
DB Insert
|
Send JMS Msg
|
More DB Inserts
|
Commit Transaction <- Only at this point will the database records be inserted and the JMS message sent.
XA トランザクションは完全な Java EE コンテナーでのみ使用できるため、XA トランザクションは Tomcat では使用できません。
幸運を!
カール