【问题标题】:Java EE Service dependenciesJava EE 服务依赖项
【发布时间】:2012-07-19 09:57:18
【问题描述】:

我希望这个问题不要太抽象。这是关于 Java EE 架构或服务设计的。 我有两个业务逻辑(为了便于阅读,这里简化了):

@Stateless
@LocalBean
public class EmailService {

  @EJB
  private SomeBean someBean;
  // ... some other EJBs to acces the DB layer (and using JPA)

  public void sendEmail(String recipient /* some parameters */) {
     // ... some email sending logic here

  }
}

@Stateless
@LocalBean
public class ExecutePaymentService {

  @EJB
  private UserBean userBean;
  // ... some other EJBs to acces the DB layer (and using JPA)

  public void executePayment(int amount, int userId) {
     // ... some payment logic here
     // NEED TO SEND EMAIL HERE
  }
}

我的设计是 JSF 托管 Bean 正在调用上述服务。我的问题是托管 Bean 包含一些逻辑:
- 执行付款
- 如果付款成功发送电子邮件
- 如果不做其他事情

我希望在服务 EJB 中包含此逻辑,以便托管 Bean 仅收集输入并返回结果。

其他选项是 ExecutePaymentService 扩展 EmailService 然后调用 sendEmail 的东西。这可能导致一个巨大的继承树能够从任何服务提供任何服务,在长期和大型应用程序中更难维护......由于大多数服务需要注入 EJB 来访问我无法使用的数据库非 EJB 服务....

允许service to call another service 的更好方法是什么?

【问题讨论】:

  • 如果您有机会使用 ESB,则可以使用 Drools 之类的工具来实现此选择逻辑。如果定义了“服务类型”枚举,则呈现的业务逻辑与工厂模式有些相关。您可以使用通用方法声明接口并使用带有@WebService(endpointInterface="package.MyPaymentInterface") 的类。
  • 感谢您的建议。我不认为我们可以在这个阶段实施 ESB,但是当我们需要一个新平台时,我会保留它作为一个选项。
  • 一个小建议:你不需要@LocalBean。把一个放在那里很诱人,但如果在你的情况下绝对什么都不做;没有业务接口的无状态 bean 已经自动公开了一个无接口视图,这正是 @LocalBean 的用途。

标签: jakarta-ee ejb-3.0


【解决方案1】:

您应该问问自己 ExecutePaymentService 是否是电子邮件服务。
也许电子邮件服务只是您需要的功能之一?
为什么不将电子邮件服务注入到 ExecutePaymentService?
我的回答可以应用于其他方式,例如 WebSerivces(可以使用 EJB 实现),
这更像是一个经典的面向对象设计,而不是真正的 Java 技术设计问题,一旦你了解 ExecutePaymentService 是否在它的基础是 EmailService(我感觉答案是否定的) -
您将了解如何更好地建模 bean。

【讨论】:

  • 嗯... JPA 事务是如何工作的?如果我在这两个服务中进行一些数据库编辑/创建(或者更多,就像我们有另一个日志服务,它在其他几个服务中记录特殊活动)。当我输入 PaymentService EJB 方法时,我启动了一个数据库事务。如果我注入一个还需要编辑数据库的 ActivityLoggerService(以及 PaymentService 常见的一些表),是否存在死锁或冲突或问题的风险?它会在同一个事务中运行还是在不同的事务中运行。我知道,我也必须自己检查:) 我会这样做。
  • 谢谢。您的回答使我们有了新的设计,注入了一些服务,并在不需要数据库交互时使用简单的“帮助”对象。
猜你喜欢
  • 1970-01-01
  • 2012-11-11
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多