这里有两件事。
第一件事是Java EE中未指定获取对远程EJB的引用的方式。您无法确定单个供应商认为应该如何完成。
尽管JNDI是为此目的使用的事实上的标准,但即使此本身也不是强制性的。
示例:JBoss直到AS7
在直到AS 7的JBoss AS中,使用以下序列获取远程引用:
Properties env = new Properties();env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");env.put(Context.PROVIDER_URL, "jnp://myserver.example.com:1099");InitialContext context = new InitialContext(env);Bean bean = (Bean) context.lookup("myear/MyBean/remote");在此,将远程服务器的URL提供给初始上下文,并从该上下文中检索Bean。 (请注意,您必须 NOT
:这里的前缀,否则将通过JNDI被拦截和就地解决,尽管做了查找在远程情况下加入著名的“/ JAVA”)
由于如上所述该方法不是标准化的,因此单个供应商可以在实施版本之间完全更改它。即使是针对相同Java EE版本的实现。
示例:JBoss AS7
在JBoss AS
7中,JBoss希望脱离JNDI(因为未指定必须使用JNDI),现在它大致以下列方式发生:
首先,您需要
jboss-ejb-client.properties使用以下上下文将文件放在类路径中:
endpoint.name = client-endpointremote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED = falseremote.connections = defaultremote.connection.default.host = myserver.example.comremote.connection.default.port = 4447remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANonYMOUS = false
并使用如下代码:
Properties env = new Properties();env.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");InitialContext context = new InitialContext(env);Bean bean = (Bean) context.lookup("ejb:/myear/mymodule/MyBean!com.example.Bean");因此,从代码中看,似乎没有给出URL,但是它静态地隐藏在配置文件中。
应用程序客户端容器
今天,我发现了另一个使用Netbeans 7,Java EE 6和GlassFish 3的示例。客户端代码[…]
这是另一回事。所展示的是所谓的“ 应用程序客户端容器” (又名ACC)。
这与上面的示例不同,在上面的示例中,Java SE应用程序使用JNDI与远程服务器联系。在Java
EE中,应用程序客户端容器有点晦涩难懂。这个想法似乎是您从服务器(如Applet或Java Web
Start应用程序)动态下载客户端代码,然后神奇地“知道”其起源。在主类中,对(静态)注入的支持非常有限,您可以使用它直接注入远程bean。
应用程序客户端容器是Java
EE早期的想法,据我所知,它从来没有受到太多关注。这些年来,它在最初构想之后从未取得太大进步。由于它仍然需要完成大量特定于供应商的工作,因此我认为大多数人都不会为它而烦恼,而只是使用JNDI。



