【问题标题】:Using Transaction with CDI Conversation将事务与 CDI 对话一起使用
【发布时间】:2012-06-27 07:47:16
【问题描述】:

我正在构建一个使用 CDI(焊接容器)和 @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(焊接容器)。 谢谢 琳达

【问题讨论】:

  • 看起来您已经有一个活动事务(可能是因为之前的 EJB 调用?)
  • 感谢您的回复 - 但是 startConversation() 和 endConversation() 直接作为 JSF 页面中的操作调用......

标签: cdi jboss7.x jboss-weld


【解决方案1】:

我认为你的想法有点问题。当事务绑定到服务器上的线程时,会话跨越多个请求(否则您将使用请求范围)。多个请求不会(必然,尤其是在服务多个客户端的 Web 应用程序上)绑定到同一个线程。当您使用数据库或其他事务资源时,您需要该事务。您可能应该重新考虑一下。

【讨论】:

  • 感谢您的回复。好吧,也许我误解了“对话”范围的确切作用,但是我认为在幕后这个 bean 是由一个有状态会话 bean 支持的,它能够跨越多个请求的事务。不幸的是,我找不到任何证据……但是我试了一下……
  • 不,不幸的是它没有,即使使用 EJB。事务处于线程级别,与请求不一一对应。
猜你喜欢
  • 2016-02-06
  • 2013-08-13
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多