【问题标题】:How do I specify a server to get an EJB from?如何指定服务器以从中获取 EJB?
【发布时间】:2013-09-21 20:52:46
【问题描述】:

在 java EE 中,从远程服务器获取 EJB 的方式是在 JNDI 中查找它。该规范定义了给定 bean 类型的 JNDI 名称。

但是,这似乎仅适用于您想从本地计算机上获取 bean 的情况。我想像大多数用户一样从远程服务器上获取 bean。如何指定服务器 URL?我是否将地图传递给InitialContext 构造函数?

注意:another question 几乎相同,但自从规范定义可移植 JNDI 名称以来,它已经过时了。

【问题讨论】:

    标签: java jakarta-ee ejb jndi


    【解决方案1】:

    我想从远程服务器上获取 bean

    是的,您需要指定远程服务器(JNDI 服务)正在运行/侦听的 IP/端口。

    如何指定服务器 URL?

    您必须设置属性:java.naming.provider.url 并使其可用于 InitialConetxt。

    这可以在different ways:

    1. 使用 jndi.properties 文件
    2. 使用系统属性
    3. 在创建新的实例时传递哈希表中的值 InitialContext 对象。

    实例化 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 中运行。

    【讨论】:

    • 荣誉和财富要等到我可以尝试每个解决方案。
    • for java.naming.provider.url 你怎么知道这个URL?测试网址?
    【解决方案2】:

    您使用与运行服务器端时完全相同的代码对远程 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 Spec 中没有指定这种方式,因此每个应用服务器都有自己的方式。

    例如,GlassFish 需要 include some special jars in the classpathset a couple system properties 的应用程序客户端。具体来说,您必须在类路径中包含lib/gf-installer.jar 及其清单引用的所有jar,并且必须设置org.omg.CORBA.ORBInitialHostorg.omg.CORBA.ORBInitialPort 系统属性。

    【讨论】:

    • gf-client jar 文件有多大?我不想分发太大的东西。
    • 只有大约 20K,但它的清单包含大约 55 MB 的 .jar。我相信 GlassFish 允许通过 Java WebStart 提供打包在 .ear 中的应用程序客户端,这将允许延迟加载这些 .jar,但我从未真正尝试过使用它。
    • @VGR 用于远程 JNDI 服务发现,您的代码只有在您指定此类服务的 ip 和端口时才能工作,我的意思是您可以使用相同的代码但仍然需要提供一些额外的配置到 InitialContext 。我认为有必要澄清这一点。
    • 荣誉和财富要等到我可以尝试每个解决方案。
    • @Gabriel,应用程序客户端容器的 Java EE 合同明确规定它必须使无参数 InitialContext 完全起作用。主机和端口在代码之外指定。在 GlassFish 的情况下,它是通过我在答案的最后一句中提到的两个系统属性完成的。
    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多