在 java EE 中,从远程服务器获取 EJB 的方式是在 JNDI 中查找它。该规范定义了给定 bean 类型的 JNDI 名称。
但是,这似乎仅适用于您想从本地计算机上获取 bean。我想像大多数用户一样从远程服务器上获取 bean。如何指定服务器 URL?我是否将地图传递给InitialContext
构造函数?
注意:还有另一个问题几乎相同,但自从规范定义可移植 JNDI 名称以来,它已经过时了。
在 java EE 中,从远程服务器获取 EJB 的方式是在 JNDI 中查找它。该规范定义了给定 bean 类型的 JNDI 名称。
但是,这似乎仅适用于您想从本地计算机上获取 bean。我想像大多数用户一样从远程服务器上获取 bean。如何指定服务器 URL?我是否将地图传递给InitialContext
构造函数?
注意:还有另一个问题几乎相同,但自从规范定义可移植 JNDI 名称以来,它已经过时了。
我想把 bean 从远程服务器上取下来
是的,您需要指定远程服务器(JNDI 服务)正在运行/侦听的 IP/端口。
如何指定服务器 URL?
您必须设置属性: java.naming.provider.url并使其可用于 InitialConetxt。
这可以通过不同的方式完成:
实例化 InitialConetct 的此属性和其他必要属性的具体值取决于供应商。JBoss 的一个示例可能是:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://yourServer:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
请记住,如果您不指定 url,则无法从远程服务器获取 EJB 存根。“远程”是指客户端和服务器在不同的 JVM 中运行。
您使用与运行服务器端时完全相同的代码对远程 EJB 进行 JNDI 查找:
Context context = new InitialContext(); // No properties needed
MyEJB myEjbInstance = (MyEJB) context.lookup("ejb/MyEJB");
或者,当然,您可以注入它:
@EJB
private MyEJB myEjbInstance;
要使命名上下文起作用,您必须将应用程序作为 Java EE应用程序客户端运行。应用程序客户端与常规的独立 Java 程序完全一样,具有标准main
方法;唯一的区别是它需要以不同的方式运行。Java EE 规范中没有指定这种方式,因此每个应用程序服务器都有自己的方式。
例如,GlassFish 要求应用程序客户端在类路径中包含一些特殊的 jar,并设置几个系统属性。具体来说,您必须在类路径中包含lib/gf-installer.jar
其清单引用的所有 jar,并且必须设置org.omg.CORBA.ORBInitialHost
和org.omg.CORBA.ORBInitialPort
系统属性。