我有几个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
。
现在我没有遇到任何问题,但我在问:这种分享会带来什么问题吗?延误?或者,既然管理者是无国籍的,那还可以吗?
提前致谢。
答案 0 :(得分:1)
只要对这些服务的引用是实例变量,您就可以使用无状态服务。或者,您可以创建一个getManagerAdmin()
方法来处理查找,因此您不必在每个方法中重复查找代码。
如果您可以使用Java EE 6,从而使用EJB 3.1,您可能希望让容器将服务注入servlet。请注意,这仅适用于同一类加载上下文中的本地查找(通常是相同的应用程序,但如果应用程序未被Web /应用程序服务器隔离,则它可能是相同的JVM)。