3

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

我有一些 jars 部署在不同的 OAS 容器中,在 jars 中有 Stateless EJB 3.0,它们有一些通过 RMI 使用的方法,这些方法是通过 Wars 应用程序中的 RMI 调用的

但是现在我们有了一个新的要求,从一次战争中,我必须从一个事务内不同容器中的不同 jars 文件中调用 3 个方法,如果某个 jar 中的某些方法失败,我必须对所有方法进行回滚。

例子:

JAR A,具有部署在 OAS 容器“OAS A”中的 EJB“A”,并具有方法“A()”

JAR B,具有部署在 OAS 容器“OAS B”中的 EJB“B”,并具有方法“B()”

JAR C,具有部署在 OAS 容器“OAS C”中的 EJB“C”,并具有方法“C()”

WAR Z,部署在 OAS 容器中“OAS Z”必须在事务中调用方法 A() B() y C()。

由于在 War 文件中我们无法管理事务,因此我们在名为 ServiceFacade.jar 的 jar 文件中创建了一个新应用程序,并部署在 OAS 容器“OAS SF”中,并有一个调用 A() B 的 EJB“SF” () C() 通过 RMI 的其他 Ejb。

所以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) 但回滚都没有,甚至没有消息“回滚!!” 在控制台中打印。

希望各位高手能帮帮我。

谢谢!!!

4

0 回答 0