我正在尝试实现服务外观模式,
我有一些 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) 但回滚都没有,甚至没有消息“回滚!!” 在控制台中打印。
希望各位高手能帮帮我。
谢谢!!!