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

waf*_*waf 9 ejb weblogic transactions java-ee

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

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

现在,我们使用Weblogic作为我们的应用程序服务器,我们还没有配置我们的域来在不同的机器上运行应用程序.

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

Jon*_*her 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
}
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

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