事务是否可以在Weblogic中来自不同应用程序的EJB之间传播?

时间:2012-02-14 23:52:55

标签: java-ee transactions ejb weblogic

我们正在开发一个有两个主要逻辑的系统;一个是管理逻辑,非常轻;另一种是处理逻辑,它非常耗费资源(RAM + CPU)。

我们决定让一台机器运行管理逻辑,一台(或多台)其他机器运行处理逻辑。
为了将逻辑分成不同的机器,我们为每个逻辑创建了一个应用程序(EAR),它为我们提供了两个独立的应用程序。

现在,我们使用Weblogic作为我们的应用程序服务器,而我们尚未配置域以在不同的计算机上运行应用程序。

在我们这样做之前,我们想知道;当来自管理应用程序的EJB将从处理应用程序调用EJB时​​,事务是否会传播?如果管理EJB将回滚其事务,那么处理EJB是否也会回滚它?此功能是否需要对域进行特殊配置?

1 个答案:

答案 0 :(得分:7)

是。如果您遵循最佳实践并且不尝试任何愚蠢的事情,那么事务和回滚都会传播。这正是EJB的目的!如果您需要有关如何使用@EJB正确注入EJB的帮助,一个很好的指南是掌握EJB3.1或来自JavaLobby的简短EJB3.0 refcard。

EJB使用声明式事务管理,因此您需要确保在Bean上放置正确的声明:

@Stateless
@Remote({MyService.class})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class MyServiceBean implements MyService {
    ...awesome code here
}

修改

一个重要的注意事项是,您需要让顶级EJB为您启动事务并将所有调用链接到其他EJB,或者您需要在调用多个EJB之前手动启动事务。

如果您在servlet中,并且调用了带有REQUIRED注释的6个EJB,那么您将获得6个事务,因为事务边界在每次调用EJB时​​开始,并以该方法结束。

如果您在EJB中,并且调用了另外6个用REQUIRED注释的EJB,那么您将获得一个事务,因为事务边界已经启动。