Message Driven Bean Business Logic是否应委托给EJB会话bean

时间:2018-06-07 08:59:47

标签: java ejb message-driven-bean

我被要求调查我们的一些MDB以及适用的逻辑移动到EJB。我的问题是,如果所有逻辑都在OnMessage方法中,或者这应该调用EJB方法是否重要。当前逻辑不需要直接调用,因此不需要通过EJB访问它。调用EJB的MDB会有什么好处吗?

3 个答案:

答案 0 :(得分:1)

将逻辑移动到EJB的主要好处是,这将为您提供对事务边界的额外控制。

由于MDB本质上是事务性的,因此失败可能导致回滚,然后重新传递消息。有时候这正是你想要的行为,但并不常见。

如果在EJB上配置服务方法以便它启动新事务(REQUIRES_NEW),那么任何错误都将导致EJB事务的回滚,而不是MDB的回滚。

然后onMessage方法可以采取任何恢复(或不恢复)其仍然完整的事务所需的操作。

答案 1 :(得分:0)

MDB和EJB bean之间存在差异。 MDB主要用于异步处理,其中某些系统将消息放入队列,然后应用程序服务器从池中获取MDB实例并处理该消息。 对于EJB,它是一个同步调用,客户端必须等待Application Server响应。

因此,如果您想将登录信息移至MDB,请检查是否需要该MDB正在执行的Asynhronous工作。

而不是将逻辑移动到EJB并调用该EJB,您可以创建一个内部服务类,该服务类将具有业务逻辑并使用MDB和EJB实现方法中的此服务。 无论客户想要它(异步/同步),您都可以提供相同的业务逻辑。

答案 2 :(得分:0)

MDB可以包含对另一个EJB,JMS连接资源和任何其他数据源或数据库连接资源的引用。 除此之外,它不应该持有任何状态(就像没有持有客户状态的无状态bean)。客户端不直接访问MDB,也不会暴露任何接口,mdbs会从客户端异步侦听消息。

因此,请检查MDB实例是否保留特定客户端的任何数据或会话状态。 通常,容器应该能够将消息分配给任何一个mdb并且还集合实例,以便可以同时处理来自多个客户端的消息流。因此,对于任何其他类来说,分离关注点也会带来好处,MDB应该按照预期的方式执行操作,将与消息处理相关的业务逻辑移动到另一个EJB实例(如果需要contianer服务)。

  

关注点分离的价值在于简化开发和   维护计算机程序。当问题分离时,   各个部分可以重复使用,也可以开发和更新   独立。特别有价值的是后来提高或改善的能力   修改一段代码而不必知道其他代码的细节   部分,而不必对这些部分进行相应的更改   部分。

参见wiki Separation of concerns。如果你需要像交易这样的容器服务,那么单独的类需要是一个ejb。