Jakarta ee EJB调用另一个EJB方法

Jakarta ee EJB调用另一个EJB方法,jakarta-ee,ejb-3.0,Jakarta Ee,Ejb 3.0,我更想知道这是一种最佳做法还是应该避免。假设我有两个EJB,每个EJB使用不同类型的对象,一个小部件和一个foo。管理小部件的EJB需要获取一组FOO来进行一些处理。此功能已经在FooManager bean中创建 正在创建WidgetManager中的方法,而已创建FooManager方法 这是我的意思的一个例子。这是一个简单的例子 @Stateless public class FooManager implements FooManagerLocal, FooManagerRemote {

我更想知道这是一种最佳做法还是应该避免。假设我有两个EJB,每个EJB使用不同类型的对象,一个小部件和一个foo。管理小部件的EJB需要获取一组FOO来进行一些处理。此功能已经在FooManager bean中创建

正在创建WidgetManager中的方法,而已创建FooManager方法

这是我的意思的一个例子。这是一个简单的例子

@Stateless
public class FooManager implements FooManagerLocal, FooManagerRemote
{
   public List<Foo> getAllFoosForAWidget(widgetId)
   {
      //runs queries and builds foo list 
   }

   public Boolean isWidgetCloseable(widgetId)
   {
     //a widget is closeable if all foos for that widget are set to "done"

     List<Foo> foos = getallFoosForAWidget(widgetId);
     boolean isCloseable = false;
     //process foos and update isCloseable respectively
     return new Boolean(boolean);

   }

}

@Stateless
public class WidgetManager implements WidgetManagerLocal, WidgetManagerRemote
{
   public void closeWidgetIfFoosAreDone(widgetId) //needs to do stuff with foos
   { 
      //generate the widget based on widgetId
      Widget widget = find(Widget.class, widgetId) 


      //is this appropriate?
      //beans are gathered through our own beanclient
      FooManager fooManager = BeanClient.getBean(FooManager.class);
      if(fooManager.isWidgetCloseable(widgetId)
      {
         widget.setStatus(Close);
         save(widget); //save widget back to database
      }
   }
}
@无状态
公共类FooManager实现FooManagerLocal、FooManagerRemote
{
公共列表GetAllFoosFrawidget(widgetId)
{
//运行查询并生成foo列表
}
公共布尔值isWidgetCloseable(widgetId)
{
//如果小部件的所有foo都设置为“done”,则该小部件是可关闭的
List foos=GetAllFoosFrawidGet(widgetId);
布尔值isCloseable=false;
//处理foo和更新分别是可关闭的
返回新的布尔值(布尔值);
}
}
@无国籍
公共类WidgetManager实现WidgetManagerLocal、WidgetManagerRemote
{
public void closeWidgetIfFoosAreDone(widgetId)//需要处理foos
{ 
//基于widgetId生成小部件
Widget Widget=find(Widget.class,widgetId)
//这是否恰当?
//豆子是通过我们自己的豆客户收集的
FooManager-FooManager=BeanClient.getBean(FooManager.class);
if(fooManager.isWidgetCloseable(widgetId)
{
widget.setStatus(关闭);
保存(小部件);//将小部件保存回数据库
}
}
}
我的问题是WidgetManager bean是否应该调用FooManager bean中已经创建的方法?客户端是否应该检查哪些小部件可以关闭,然后向WidgetManager发送ID列表


我倾向于后一种情况,这样EJB就不必担心互相调用方法。客户端可以使用它们,只需要发送一个ID列表。

我将在WidgetManager中保留简单的“close”方法。这样一来,它与foo的方法就不那么紧密了

因此,在其他一些业务Bean中,您将注入这两个Bean并构建您的逻辑

@Stateless
class SomeBusinessProcess implements ISomeBusinessProcess
{
   @EJB FooManagerLocal fooManager;
   @EJB WidgetManagerLocal widgetManager;

   public void process(WidgetId id)
   {
      if (fooManager.isClosable(id))
            widgetManager.close(id);
   }
}

这样,您将有更多的自由,您的管理者bean将更加清晰。

上述模式被称为服务外观,在这里进行了详细讨论:

老实说,描述并不完整,也有点抽象。我同意。一开始就好像它要去某个地方,然后就没有了