【问题标题】:Is calling an EJB inside another EJB healthy?在另一个 EJB 中调用 EJB 是否健康?
【发布时间】:2015-02-13 14:41:14
【问题描述】:

我正在 Java EE、JSF/Primefaces 和 hibernate 下创建一个文档共享平台。对于每个数据对象(文档、存储库和用户),我创建了一个 List<Event> events; 来存储各种事件(用户创建、文档修改等)。

为了尊重分层架构,我有一个定义数据对象的模型层、一个定义会话 bean(包含逻辑)的业务层和定义应用程序视图的表示层。

我为每个数据对象创建了一个会话 bean 来对其处理进行编码。所以我有一个EventsSessionBean 来处理事件的持久性和获取,只要UserSessionBeanDocumentSessionBean 等。

比如在创建User的时候,我之前需要在数据库中持久化UserCreated事件。因此,我必须从EventsSessionBean 调用UserSessionBean 中的方法public Event createEvent(String label);

这是一种“健康”的编码方式吗?恐怕我的豆子之间会混杂责任。

代码 sn-p:

//Class definition
@PersistenceContext
private EntityManager em;
@EJB
private EventSessionBeanLocal eventService;
public static final String EVENT_USER_CREATION = "UserCreated";

public  RepositoryOwner createRepositoryOwner(/* username, email, ..etc*/){
    Event event = eventService.createEvent(EVENT_USER_CREATION);
    RepositoryOwner newUser = new RepositoryOwner();
    LinkedList<Event> events = new new LinkedList<>();
    events.add(event);
    newUser.setEvents(events);
    //Set other user attributes
    newUser = em.merge(newUser);
    return newUser;
}

认为UserSessionBean 在处理事件时对超出其范围的事物进行操作是否有误?

【问题讨论】:

  • 完全健康。
  • 只有经过编辑的代码描述,不可能说实际所做的事情是否健康。从 EJB 中调用 EJB 当然完全没问题(事实上——你应该这样做),但这并不意味着你拥有的任何代码都在做正确的事情。
  • @Gimby 你怎么看?
  • @Hichamov 扁平的简单代码,可读性强,并以代码可重用的方式正确分离关注点。打败我为什么你怀疑你面前的东西。
  • 我最关心我的每一个豆子的责任。我很容易认为,在这个问题的情况下,UserSessionBean 正在处理超出其范围的事件创建

标签: java hibernate jsf jakarta-ee primefaces


【解决方案1】:

这没有错,这是常见的做法。另一种方法(是否可以应用它的天气取决于您的要求和业务逻辑)是拥有一个消息队列(MQ),您可以将其用于此类任务。例如,您的UserSessionBean 会在创建用户时将消息添加到队列中,而某些message driven bean (MDB) 会收到该消息,并调用EventSessionBean 以保持事件。

但是,就像我说的那样,这取决于你的要求,这是否可以很好地使用。

【讨论】:

  • 非常感谢。我的要求很宽松,我将研究 MDB 方法(从不使用一个)
猜你喜欢
  • 2014-08-23
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2013-01-05
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多