在Servlet的init()中查找远程EJB会话是否可以?

时间:2011-12-28 19:13:35

标签: java session servlets ejb-3.0

我有几个Servlet调用远程EJB会话来管理用户的请求。我第一次以这种方式在每种方法中创建了一个新的经理:

ManagerAdminRemote managerAdmin;
Context jndiContext = new javax.naming.InitialContext();
Object ref = jndiContext.lookup("ManagerAdmin/remote");
managerAdmin = (ManagerAdminRemote) PortableRemoteObject.narrow(ref, ManagerAdminRemote.class);

为了避免这种重复,我实现了init方法,如下所示:

public void init(ServletConfig config) throws ServletException {
    super.init(config);
    try {
        Context jndiContext = new javax.naming.InitialContext();
        Object ref = jndiContext.lookup("ManagerAdmin/remote");
        managerAdmin = (ManagerAdminRemote) PortableRemoteObject.narrow(ref, ManagerAdminRemote.class);
    } catch (NamingException e) {
        e.printStackTrace();
    }
}

managerAdmin声明为类属性 会话Bean ManagerAdmin是无状态的。

我正在使用JBoss 5,我看到第一次调用Servlet时会调用init()。但我也注意到所有用户共享声明为class属性的相同对象。因此,这样,不同的用户将共享相同的managerAdmin

现在我没有遇到任何问题,但我在问:这种分享会带来什么问题吗?延误?或者,既然管理者是无国籍的,那还可以吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

只要对这些服务的引用是实例变量,您就可以使用无状态服务。或者,您可以创建一个getManagerAdmin()方法来处理查找,因此您不必在每个方法中重复查找代码。

如果您可以使用Java EE 6,从而使用EJB 3.1,您可能希望让容器将服务注入servlet。请注意,这仅适用于同一类加载上下文中的本地查找(通常是相同的应用程序,但如果应用程序未被Web /应用程序服务器隔离,则它可能是相同的JVM)。