EJB 3交易服务门面

时间:2012-11-27 22:02:49

标签: transactions ejb rollback

我正在尝试实施服务门面模式,

我有一些罐子在不同的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),但是没有回滚,甚至也没有“回滚!!”消息。在控制台中打印。

希望你的专家可以帮助我。

感谢!!!

0 个答案:

没有答案