0

ビューにCDI(Weld Container)と@ConversationScopeを使用するアプリケーションを構築しています。会話の最初にJTAトランザクションを開始し、最後にコミット/ロールバックする必要があります。だから私はこれをコーディングしました:

@Named 
@ConversationScoped
public class ConversationBean implements Serializable {

 private @Inject UserTransaction utx;
 private @Inject Conversation conversation;

 public void startConversation(){
    conversation.begin();
    try {
        utx.begin();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }
 public void stopConversation(){
    conversation.end();
    try {
        utx.commit();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
 }

}

しかし、結果は私が会話/トランザクションを開始すると

09:23:33,795エラー[org.jboss.as.txn](http--127.0.0.1-8180-1)JBAS010152:アプリケーションエラー:トランザクションはステータス0のリクエストでまだアクティブです

そして、私がコミットを発行するとき:

09:23:56,513エラー[stderr](http--127.0.0.1-8180-1)java.lang.IllegalStateException:BaseTransaction.commit-ARJUNA016074:トランザクションがありません!

これがどのように機能するのか、何か考えはありますか?私の環境はJBossアプリケーションサーバー7.1.1(溶接コンテナ)です。ありがとうリンダ

4

1 に答える 1

2

ここでの考え方には少し問題があると思います。トランザクションがサーバー上のスレッドにバインドされている間、会話は複数のリクエストにまたがります(そうでない場合は、リクエストスコープを使用します)。複数のリクエストは(特に、複数のクライアントにサービスを提供するWebアプリでは)同じスレッドにバインドされません。データベースまたはその他のトランザクションリソースを使用しているときに、トランザクションが必要になります。あなたはおそらくそれを少し再考する必要があります。

于 2012-06-27T19:19:35.823 に答える