【发布时间】: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