我对使用JNDI查找EJB存根感到困惑。如果我有一个不动态下载存根的应用服务器,因此我在客户端类路径上有存根,那么我的客户端用JNDI查找这些存根的目的是什么?
例如:
InitialContext ctx=new InitialContext();
SomeEJBHome stub=ctx.lookup("someEJB");
这里我找回了一个存根,我已经在我的类路径中了。它是通过client.jar或者你有什么。如果我已经拥有它,为什么我要查找该存根?
答案 0 :(得分:2)
如果您的EJB客户端(调用者,即Web应用程序)和EJB驻留在同一个EAR(JVM集群等)中,这将开箱即用。如果您有不同的EAR,其中一个包含您的Web客户端,另一个包含您的EJB,则必须通常使用JAR文件使客户端存根(eclipse项目类型 EJB客户端)可用于客户端存根。 / p>
那么,如果我已经拥有它,为什么我会查找该存根? 您必须查找存根,因为EJB是由Java EE容器管理的对象,因此您不能简单地实例化它。如果查找它,则会检索容器创建的对象。
BTW:如果您使用Java EE 6,您可以摆脱这些东西,改为使用依赖注入。
客户端存根将客户端实现到远程接口,但是他们不知道连接到哪里。以下行定义客户端用于连接EJB容器的上下文。如果是远程客户端,则必须指定不同的属性,如hostname和port,以便上下文知道从哪里检索对远程EJB的引用。
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, <NamingContextFactory>);
env.put(Context.PROVIDER_URL, <url:port>);
env.put(... container specific props);
InitialContext ctx = new InitialContext(env);
以下调用尝试在上面提供的远程位置查找EJB:
SomeEJBHome stub = ctx.lookup("someEJB");