Transactions EJB3事务服务外观

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(

我正在尝试实现服务外观模式

我有一些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对象以以下方式管理事务:

   @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!!”

希望各位专家能帮助我

谢谢