Transactions EJB3事务服务外观
我正在尝试实现服务外观模式 我有一些JAR部署在不同的OAS容器中,JAR中有无状态的EJB3.0,它们有一些通过RMI使用的方法,这些方法通过RMI从Wars应用程序调用 但是现在我们有一个新的需求,从一场战争开始,我必须从一个事务中不同容器中的不同jar文件调用3个方法,如果某个jar中的某个方法失败,我必须对所有方法进行回滚 例如: JARA中,有部署在OAS容器“OAS A”中的EJB“A”,并有方法“A() JARB,具有部署在OAS容器“OAS B”中的EJB“B”,并具有方法“B() JARC中,有部署在OAS容器“OAS C”中的EJB“C”,并有方法“C() WARZ是部署在OAS容器中的“OASZ”,必须在事务中调用方法A()B()y()C() 因为在War文件中我们无法管理事务,所以我们创建了一个新的应用程序,它位于一个名为ServiceFacade.jar的jar文件中,部署在OAS容器“OAS SF”中,并且有一个EJB“SF”,通过RMI调用其他EJB的a()B()C() 因此WARZ通过RMI调用serviceFacade方法,该方法调用了3个方法,所有这些方法都可以正常工作 问题出在哪里 在EJB SF中,我们使用UserTransaction对象以以下方式管理事务:Transactions EJB3事务服务外观,transactions,ejb,rollback,Transactions,Ejb,Rollback,我正在尝试实现服务外观模式 我有一些JAR部署在不同的OAS容器中,JAR中有无状态的EJB3.0,它们有一些通过RMI使用的方法,这些方法通过RMI从Wars应用程序调用 但是现在我们有一个新的需求,从一场战争开始,我必须从一个事务中不同容器中的不同jar文件调用3个方法,如果某个jar中的某个方法失败,我必须对所有方法进行回滚 例如: JARA中,有部署在OAS容器“OAS A”中的EJB“A”,并有方法“A() JARB,具有部署在OAS容器“OAS B”中的EJB“B”,并具有方法“B(
@Stateless(name="SF")
@TransactionManagement(TransactionManagementType.BEAN)
@ApplicationException(rollback = true)
public class ServiceFacade ...
@Resource private UserTransaction userTx;
public void test() {
try {
userTx.begin();
getEJBA().A();
getEJBB().B();
getEJBC().C();
userTx.commit();
} catch (Exception e) {
try {
if (userTx != null &&
(userTx.getStatus() == Status.STATUS_ACTIVE ||
userTx.getStatus() == Status.STATUS_MARKED_ROLLBACK)) {
System.out.println("Rollback!!");
userTx.rollback();
}
} catch (SystemException ex) {
throw new SIGNOSException(SIGNOSException.DEFAULT_EXCEPTION,
ex.getMessage());
}
throw (SIGNOSException)e;
}
}
但是当从WARZ调用test()方法时,事务中的某个方法,比如getEJBB().B();失败,方法getEJBA().A();不会回滚
我们能做什么?我们还尝试了TransactionManagementType.Container和@TransactionAttribute(TransactionAttributeType.REQUIRED),但回滚也没有,甚至控制台中打印了消息“rollback!!”
希望各位专家能帮助我
谢谢