我正在尝试实施服务门面模式,
我有一些罐子在不同的OAS容器中部署,在罐子里面有无状态EJB 3.0,它们有一些通过RMI消耗的方法,这些方法是通过来自Wars应用程序的RMI调用的
但是现在我们有一个新的要求,从一场战争我必须从一个事务中的不同容器中的不同jar文件中调用3个方法,如果某个jar中的某些方法失败,我必须在所有的回滚中执行回滚方法
示例:
JAR A,将EJB“A”部署在OAS容器“OAS A”中并使用方法“A()”
JAR B,将EJB“B”部署在OAS容器“OAS B”中,并使用方法“B()”
JAR C,在OAS容器“OAS C”中部署EJB“C”并使用方法“C()”
WAR Z,在OAS容器中部署“OAS Z”必须在事务中调用方法A()B()和C()。
由于在War文件中我们无法管理事务,因此我们创建一个名为ServiceFacade.jar的jar文件中的新应用程序,并部署在OAS容器“OAS SF”中,并具有调用A的EJB“SF” ()B()通过RMI的其他Ejbs的C()。
所以WAR Z通过RMI调用调用3种方法的serviceFacade方法,一切正常。
问题?
在EJB SF中,我们使用UserTransaction对象以这种方式管理事务:
@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;
}
}
但是当从战争Z中调用test()方法并在事务中调用一些方法时,让我们说getEJBB()。B();失败,方法getEJBA()。A();没有回滚!!
我们能做什么?我们还尝试使用TransactionManagementType.Container和@TransactionAttribute(TransactionAttributeType.REQUIRED),但是没有回滚,甚至也没有“回滚!!”消息。在控制台中打印。
希望你的专家可以帮助我。
感谢!!!