有哪些技术可以管理"会话"远程调用期间无状态EJB的调用或调用上下文?

时间:2015-06-19 18:45:10

标签: session java-ee ejb rmi java-ee-6

我正在编写一个使用RMI调用EJB的应用程序。 EJB是无状态的;业务要求不需要与客户进行会话状态。

EJB方法调用的一个参数是" User"用于确定与调用关联的用户是否有权执行操作的对象。我们没有使用容器管理的auth-auth:User对象只是远程客户端提供的POJO。

我想在" session"中使这个User对象全局可用/可注入;或调用上下文。我知道无状态EJB没有"会话"在EJB意义上;我的意思是" session"是"当前的调用"。例如,假设我们只有一个具有两种方法的远程EJB:

  • myStatelessEjb.add(Thing, User)
  • myStatelessEjb.update(Thing, User)

这些方法调用了更多的方法:涉及其他EJB,Bean验证器等。我不想在任何地方传递User对象,而是希望使用当前远程的上下文使User对象全局可用/可注入EJB调用。

我当然可以传递User对象或用" Thing"封装它,但我想也许更好的设计是不会污染"我与User的对象和API,因为它是一个贯穿各领域的问题。

备注(强调):

  • 我正在使用RMI。
  • 没有HTTP会话,因为我使用的是RMI。
  • 我没有使用容器管理的auth-auth。
  • 我正在使用容器管理的交易。

是否有适合此问题的标准技术?例如也许远程客户端应该调用一个有状态的EJB来保存用户,或者ThreadLocal是合适的,或者我可以挂钩到容器管理的事务,或者可能已经有一个适用的会话/上下文I'我不知道。

1 个答案:

答案 0 :(得分:2)

最简单的方法是将用户存储在@RequestScoped CDI bean中并根据需要注入:

@RequestScoped
public class RequestUser {
    private User user;

    //getter and setter for user
}

@Remote
@Statless
public class MyRemoteInterface {
   @Inject
   private RequestUser requestUser;
   ...
   public void foo(User user, Bar bar) {
      request.setUser(user);
      ...
   }
}

@Stateless
public class OtherEJB() {
    @Inject
    private RequestUser user;

    public void doBar(Bar bar) {
        User user = user.getUser();
        ...
    } 
}

虽然@SessionScoped仅对HTTP会话有用,但@RequestScoped具有更广泛的适用性:

  

public @interface RequestScoped

     

指定bean是请求作用域。

     

请求范围已激活:

     
      
  • 在Web应用程序中任何servlet的service()方法期间,在任何servlet过滤器的doFilter()方法期间以及   容器调用任何ServletRequestListener或AsyncListener,
  •   
  • 在任何Java EE Web服务调用期间,
  •   
  • 在任何EJB的任何远程方法调用期间,在任何EJB的任何异步方法调用期间,在对EJB的任何调用期间   超时方法以及在消息传递到任何EJB消息驱动的过程中   豆和
  •   
  • 在从MessageEistener传递到从Java EE组件环境获取的JMS主题或队列的任何消息传递期间。
  •