私は状況を説明しようとします。私たちにはウェブサービスがあります。各リクエストでWebサービスがJTAトランザクションを開始します。その中のXAデータソースを通じていくつかのデータベース呼び出しを実行し、他のいくつかのWebサービス(トランザクションコンテキスト外)を呼び出し、他のサーバー上でいくつかのリモートEJB呼び出しを行います。トランザクション内でトランザクションレスEJBコールを作成する
問題は、コンテナがEJBをトランザクションに関与させようとしているように見えますが、論理的に見えますが、実際にはそのトランザクションに参加していないときは、最終的なコミット段階ですが、EJBコールを除外すると正常に動作します。
EJB実装を変更できず、Webサービスコードのみを制御できません。ですから、私の質問は、トランザクション認識型EJBへのEJB呼び出しをどのようにして行うのですか?しかし、JTAトランザクションから、他のXAリソースのためのJTAトランザクションにはまだありますか?私は私の質問を明確にしたいと思う。
EDIT:擬似コードの例と、それがより明確にしようとすると:
// Begin transaction
UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION);
tx.begin();
// Do some database operations on XA datasource
// Call remote EJB which has transcation attribute set to 'Supports'
AccountInfo account = accountEjb.getAccountInfo(userId, accountId); // <-- Is it possible to make this to be not be part of user transction?
// Do some more database operations on XA datasource
// Commit transaction
tx.commit();
なぜあなたはタイムアウトを増やしませんか? –
問題がタイムアウトしていないため、すべてのコールがミリ秒以内に正常に終了しますが、トランザクションが最後にコミットされるとタイムアウトします。ejbコールがコールシーケンスから削除されると、okをコミットします。だから、実際にはサーバ間の通信で何かをしなければならないと思っていますが、タイムアウトの価値はありません。 –