我希望这个问题不要太抽象。这是关于Java EE体系结构或服务设计的。 我有两个业务逻辑(这里简化为便于阅读):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呼吁上述服务。我的问题是,托管豆类含有一些逻辑:
- 执行付款
- 如果付款成功发送电子邮件
- 如果没有做别的事情
我想有在服务EJB所以这个逻辑Managed Beans只收集输入和返回结果。
其他选项是ExecutePaymentService
扩展EmailService
然后调用sendEmail东西。这可能导致巨大的继承树能够从任何服务提供任何服务,难以在长时间运行和大型应用程序中维护....由于大多数服务需要注入EJB来访问数据库,因此我无法使用非EJB服务....
什么会是一个更好的办法,让一个service to call another service
?
如果您有机会使用ESB,则可以使用像Drools这样的工具来实现此选择逻辑。如果定义了“服务类型”枚举,则呈现的业务逻辑与工厂模式有些相关。您可以使用常规方法声明接口并使用带有@WebService(endpointInterface =“package.MyPaymentInterface”)的类。 – 2012-07-19 11:39:20
谢谢您的建议。我不认为我们现阶段可以实现ESB,但是当我们需要一个新的平台时,我会保留它作为一个选项。 – JScoobyCed 2012-07-20 02:26:25
一个小建议:你不需要'@ LocalBean'。把一个人放在那里是非常诱人的,但是如果在你的情况下绝对没有做任何事情;一个没有业务接口的无状态bean已经自动公开了一个无接口的视图,这正是'@ LocalBean'的用处。 – 2012-07-20 22:53:25