使用 CMT 的此场景有效:
具有 CMT 的无状态会话 bean,一种注释方法@TransactionAttribute(TransactionAttributeType.MANDATORY)
。在此方法中,使用 XA 数据源和普通 JDBC 将记录写入 RDBMS。
独立客户端(单独的 JVM、命令行 Java 应用程序)正在获取UserTransaction
从应用程序服务器(通过 JNDI 查找),
启动事务并调用 EJB。
如果客户提交UserTransaction
,该记录被写入数据库。
- 如果客户端回滚
UserTransaction
,该记录未写入数据库。
在PostgreSql日志文件中,可以通过BEGIN、COMMIT或ROLLBACK看到准备好的事务
如果客户端在调用 EJB 之前没有启动事务,则javax.ejb.EJBTransactionRequiredException
被抛出(正如预期的那样,TransactionAttributeType.MANDATORY
).
现在我从 CMT 切换到 BMT
同样,如果客户端在调用 EJB 之前没有启动事务,则会出现javax.ejb.EJBTransactionRequiredException
被抛出(如预期,TransactionAttributeType.MANDATORY)。
如果我打电话sessionContext.getUserTransaction().getStatus()
,它总是报告Status.STATUS_NO_TRANSACTION
.
如果客户端调用,记录总是写入数据库commit
or rollback
.
在 PostgreSql 日志文件中,没有准备好的事务,只有简单的插入命令。
EJB的来源:
@Remote(DemoIfc.class)
@Stateless(name = "DemoBmt")
@TransactionManagement(TransactionManagementType.BEAN)
public class DemoBmt implements DemoIfc {
@Resource
private SessionContext sessionContext;
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public String ping(final String s) throws SystemException {
try {
System.out.println("TX: status: "
+ this.sessionContext.getUserTransaction().getStatus());
} catch (Exception e) {
System.out.println("TX: status: " + e.getMessage());
}
try {
writeIntoDb();
if (s.startsWith("crash")) {
throw new SystemException("Simulated crash");
}
return s.toUpperCase();
} catch (NamingException e) {
throw new SystemException(e.getMessage());
} catch (SQLException e) {
throw new SystemException(e.getMessage());
}
}
}
客户来源:
final UserTransaction ut = (UserTransaction) initialContext
.lookup("UserTransaction");
try {
ut.begin();
System.out.println(demo.ping("crash: DemoBmt with UT"));
ut.commit();
} catch (Exception ex) {
System.out.println("Expected rollback");
ut.rollback();
}
我使用的是 JBoss 6.0.0 Final。
如何使用 BMT 将客户端 UserTransaction 正确传播到 EJB 中?
BMT bean 无法参与现有事务
From EJB 3.1 规范:
13.6.1 Bean 管理的事务划分
容器必须管理客户端对企业 Bean 的调用
实例与 bean 管理的事务划分如下。当一个
客户端通过企业 bean 之一调用业务方法
客户端视图,容器暂停任何可能的事务
与客户请求相关......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)