代码之家  ›  专栏  ›  技术社区  ›  Sylar

是否可以将同一个有状态会话bean实例注入多个其他会话bean?

  •  1
  • Sylar  · 技术社区  · 16 年前

    是否可以让容器将同一个有状态会话bean实例注入到多个其他有状态会话bean中?

    @Stateful
    public class StatefulTwoBean implements StatefulTwo {
    
        @EJB
        private StatefulOne statefulOne;
    
    }
    
    @Stateful
    public class StatefulThreeBean implements StatefulThree {
    
        @EJB
        private StatefulOne statefulOne;
    
    }
    

    在上面的例子中, 扁豆 每个人都会被注入自己的实例 扁豆 .

    属于 扁豆 两者兼而有之 国宾 ?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Bozho    16 年前

    问题在于,有状态bean的存在是通过区分调用它们的客户端来分配的。玻璃鱼(也许还有其他鱼)不会在注射的豆子上传播这种差异。据我记忆所及,EJB规范对此并不清楚。

    因此,您的解决方案是自己实施差异化。如何做到这一点。我并没有假装这是最漂亮的解决方案,但它确实奏效了我们通过在所有EJB前面放置一个Facade(EJB本身)(我称之为Facade,尽管它并不完全涵盖Facade模式),使用以下代码:

    public Object call(Object bean,
            String methodName,
            Object[] args,
            Class[] parameterTypes,
            UUID sessionId) throws Throwable {
    
        //find the session
        SessionContext sessionContext = SessionRegistry.getSession(sessionId);
        //set it as current
        SessionRegistry.setLocalSession(sessionContext);
        .....
    }
    

    重要参数是 sessionId -这是客户机和服务器都知道的,并标识它们之间的当前会话。

    在客户端上,我们使用动态代理来调用这个facade。所以这些电话是这样的: getBean(MyConcreteEJB.class).someMethod()

    这个 SessionRegistry

    private static ThreadLocal<SessionContext> localSessionContext = new 
       ThreadLocal<SessionContext>();
    

    SessionContext set(key, value) get(key)

    所以现在,不用 @Stateful bean来存储您的状态,您可以使用 会话上下文 .

        2
  •  2
  •   jawi    16 年前

    在EJB3.1中,您可以创建 StatefulOne @Singleton 注释)为您提供所需的语义。JBoss应该已经支持这个注释(他们已经编写了标准)。