2012-06-27 40 views
0

我正在構建一個使用CDI(Weld Container)和@ConversationScope作爲視圖的應用程序。我需要在對話開始時啓動一個JTA事務,並在最後提交/回滾。所以,我有編碼的:使用交易與CDI對話

@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:33795 ERROR [org.jboss.as.txn](HTTP - 127.0 .0.1-8180-1)JBAS010152:應用程序錯誤:交易與狀態0

請求仍然有效,而當我發出提交:

09:23:56513 ERROR [stderr的](http-- 127.0.0.1-8180-1)java.lang .IllegalStateException:BaseTransaction.commit - ARJUNA016074:無事務!

任何想法如何工作?我的環境是JBoss應用服務器7.1.1(焊接容器)。 謝謝 琳達

+0

看起來您已經擁有一個活動的事務(可能是因爲之前的EJB調用?) –

+0

感謝您的答覆 - 但是,直接調用startConversation()和endConversation()作爲來自JSF頁面的操作...... –

回答

2

我覺得你的想法有點問題在這裏。對話跨越多個請求(否則您將使用請求範圍),而事務綁定到服務器上的線程。多個請求不一定(特別是在一個Web應用程序服務多個客戶端)綁定到同一個線程。當您使用數據庫或其他事務資源時,您需要執行該事務。你應該重新考慮一下。

+0

感謝您的回覆。好吧,也許我誤解了「對話」範圍究竟做了什麼,但是我認爲這個bean在後臺被一個有狀態會話bean支持,它可以跨多個請求跨越一個事務。不幸的是,我找不到任何證據.....但是我試了一下..... –

+1

不,不幸的是,即使使用EJB也不行。事務處於線程級別,與請求不對應1:1。 – LightGuard