如果每个JNDI已经在客户端类路径中,为什么我必须查找EJB存根?

时间:2011-08-31 18:52:02

标签: java ejb

我对使用JNDI查找EJB存根感到困惑。如果我有一个不动态下载存根的应用服务器,因此我在客户端类路径上有存根,那么我的客户端用JNDI查找这些存根的目的是什么?

例如:

InitialContext ctx=new InitialContext();
SomeEJBHome stub=ctx.lookup("someEJB");

这里我找回了一个存根,我已经在我的类路径中了。它是通过client.jar或者你有什么。如果我已经拥有它,为什么我要查找该存根?

1 个答案:

答案 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");