2012-07-19 136 views
0

我希望这个问题不要太抽象。这是关于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

+0

如果您有机会使用ESB,则可以使用像Drools这样的工具来实现此选择逻辑。如果定义了“服务类型”枚举,则呈现的业务逻辑与工厂模式有些相关。您可以使用常规方法声明接口并使用带有@WebService(endpointInterface =“package.MyPaymentInterface”)的类。 – 2012-07-19 11:39:20

+0

谢谢您的建议。我不认为我们现阶段可以实现ESB,但是当我们需要一个新的平台时,我会保留它作为一个选项。 – JScoobyCed 2012-07-20 02:26:25

+0

一个小建议:你不需要'@ LocalBean'。把一个人放在那里是非常诱人的,但是如果在你的情况下绝对没有做任何事情;一个没有业务接口的无状态bean已经自动公开了一个无接口的视图,这正是'@ LocalBean'的用处。 – 2012-07-20 22:53:25

回答

0

你应该问自己阉ExecutePaymentService是电子邮件服务。
也许电子邮件服务只是您需要的功能强弱者之一?
为什么不将电子邮件服务注入ExecutePaymentService?
我的回答可以(可以使用EJB实现)应用于其他手段,如WebSerivces,
这更像是一个典型的面向对象的设计,不是一个真正的的Java技术设计问题,一旦你了解是否ExecutePaymentService是它的基地EmailService(我有一个感觉答案是否定) -
你会明白如何更好地模拟豆类。

+0

嗯...... JPA交易如何运作?如果我在两个服务中做了一些数据库编辑/创建(或者更多,就像我们有另一个记录服务在其他几个服务中记录特殊活动一样)。当我输入PaymentService EJB方法时,我有一个数据库事务开始。如果我注入一个也需要编辑数据库的ActivityLoggerService(并且可能有一些通用于PaymentService的表),是否存在死锁或碰撞或问题的风险?它会在同一个事务中运行还是在不同的事务中运行?我知道,我必须自己检查一下:)我打算这么做。 – JScoobyCed 2012-07-20 02:31:52

+0

谢谢。您的答案使我们获得了新设计,注入了一些服务,并在不需要数据库交互时使用简单的“帮助”对象。 – JScoobyCed 2012-07-23 02:02:01