1

我有一个带有远程接口的 EJB bean。它包含在战争文件 chapter08-service-1.0 中。

@Remote
public interface BookEJBRemote {
    ...
}

在 glassfish 上部署它后,我可以从客户端调用它

Context ctx = new InitialContext();
BookEJBRemote bookEJB = (BookEJBRemote) ctx.lookup("java:global/chapter08-service-1.0/BookEJB!org.agoncal.book.javaee7.chapter08.BookEJBRemote");

它工作正常并调用该方法。但我不明白它是如何找到 EJB 甚至 glassfish 实例的?显然,在查找字符串中没有关于 glassfish 的服务器或端口的线索。

4

3 回答 3

2

但我不明白它是如何找到 EJB 甚至 glassfish instance.instance 的。

为了通过 JNDI 服务获取 EJB 引用,基本上您需要:

  1. 连接到 JNDI 服务器
  2. 连接后,使用它注册的名称查找对象。

要连接到 JNDI 服务器,您需要向 InitialContext 对象提供一些信息,例如 JNDI 服务器正在侦听的 ip/port。有不同的方法来初始化 initialContext ,如此所述。

如果您不提供此信息,InitialContext 将尝试使用上一个答案中建议的默认端口在 localhost 中搜索服务。

显然,在查找字符串中没有关于 glassfish 的服务器或端口的线索。

由于上述原因,您不会将 url 或端口信息作为查找名称参数的一部分。

于 2013-10-27T01:44:54.660 回答
0

如果您在同一台计算机上运行 glassfish 和您的客户端,则它们可能都使用默认的 JNDI 端口 1099,并且由于两者都在同一台计算机上,因此无需指定主机。

所以它的工作方式是,您的客户端首先联系 JNDI 服务器,然后 JNDI 服务器返回 EJB 所在的位置(通常是 EJB 可用的主机和端口)。

我不想听起来消极,但事实证明,EJB 是一种没有兑现承诺的技术,而且大多数公司很久以前就放弃了 EJB,或者正在努力摆脱它们。

于 2013-10-26T15:01:54.570 回答
0

InitialContext不仅选择默认主机 (localhost) 和默认端口号。此信息由 glassfish 本身明确设置,这是使用 Java Webstart 技术完成的。

您可以自己测试它:假设您的应用程序客户端已部署到 context localhost:8080/YourClient。当您访问该链接时,Webstart 正在下载并启动一个 JNLP 文件。您可以手动保存文件,而不是让它自动打开(wget localhost:8080/YourClient例如在 Linux 上)。您将看到 Glassfish 使用许多参数初始化您的客户端应用程序,包括与 JNDI 相关的属性:

<property name="java.naming.factory.initial" value="com.sun.enterprise.naming.SerialInitContextFactory"/>
<property name="java.naming.factory.url.pkgs" value="com.sun.enterprise.naming"/>
<property name="java.naming.factory.state" value="com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"/>
<property name="appclient.iiop.defaultHost" value="localhost"/>
<property name="appclient.iiop.defaultPort" value="${request.appclient.iiop.defaultPort}"/>
<property name="${appclient.download.host.propertyName}" value="localhost"/>
<property name="${appclient.user.code.is.signed.propertyName}" value="${appclient.user.code.is.signed}"/>

这些属性不仅是为了您的方便而指定的,它们是强制性的。尝试将您的客户端应用程序作为独立应用程序启动(只需在您喜欢的 IDE 中运行主类):在这种情况下,不会设置初始参数。您会注意到,如果没有这些属性,InitialContext 就不能很好地工作。

对您的问题的简短回答:InitialContext 找到 Glassfish 和 EJB,因为您的应用程序是使用特殊参数启动的,这些参数告诉 InitialContext 在哪里查找、如何初始化所需的类等。

于 2014-01-28T15:10:20.390 回答