【问题标题】:Can't contact EJB from remote machine无法从远程机器联系 EJB
【发布时间】:2015-01-27 14:32:19
【问题描述】:

正如标题所说,我无法从远程机器上联系我的 EJB。尝试联系 EJB 主机的客户端在本地使用时可以正常工作。

远程机器在 Windows XP SP3(32 位)上,Java JRE 7_71。它与在 Glasshfish 服务器上运行 EJB 的机器连接到同一网络。

第二台机器(运行 Glasshfish 服务器)在 Win7 x64 上运行。已安装 JDK 1.7_75、JDK 1.8_25、jre1.8.0_25 和 JRE 7_71。

所有防火墙都被禁用。没有使用代理。路由器后面只有两台机器连接到互联网。

我正在使用 NetBeans 8.0.2 和 Glasshfish 服务器 4.1 进行编程。

这是它的样子: http://imgur.com/zl05ACG

ABEJB”是我的 EJB。在“属性”>“源”中,“源/二进制格式为 JDK 7。在“属性”>“库”中,我添加了 JDBC 驱动程序(运行良好)并将 Java 平台设置为“JDK 1.7强>”。 注意:当我在 Glassfish 上部署 EJB 时,我得到了这些信息:

Infos:   Portable JNDI names for EJB AJoyfulBean: [java:global/ABEJB/AJoyfulBean!EJB.NewSessionBeanRemote, java:global/ABEJB/AJoyfulBean]
Infos:   Glassfish-specific (Non-portable) JNDI names for EJB AJoyfulBean: [ABS/AJoyfulBean#EJB.NewSessionBeanRemote, ABS/AJoyfulBean]

NewSessionBean.java

@Stateless(name = "AJoyfulBean")
public class NewSessionBean implements NewSessionBeanRemote
{

    @Override
    public String testConnexion()
    {
        String retour = "Connected to : " + System.getenv("COMPUTERNAME");

        try
        {
            retour += " / " + InetAddress.getLocalHost();
        }
        catch (UnknownHostException ex)
        {
            retour += "unknown IP ! :(";
        }

        return retour;
    }
}

NewSessionBeanRemote.java

@Remote
public interface NewSessionBeanRemote
{

    String testConnexion();
}

sun-ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar>
    <enterprise-beans>
        <ejb>
            <ejb-name>AJoyfulBean</ejb-name>
            <jndi-name>ABS/AJoyfulBean</jndi-name>
        </ejb>
    </enterprise-beans>
</sun-ejb-jar>

A Better Stock”是我在远程机器上的 Java 应用程序。在“属性”>“源”中,“源/二进制格式为 JDK 7。在“属性”>“库”中,我添加了来自 NetBeans 的“Java EE from GlassFish”库和来自Glassfish 安装目录。Java 平台设置为“JDK 1.7”。 EJB 接口与我的 EJB 相同(反正我没有得到 Marchal 异常)。

在我的主类的静态方法中:

try
{
    Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
    props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.164"); // the IP of the machine hosting the glassfish server
    props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
    InitialContext ctx = new InitialContext(props);

    NewSessionBeanRemote myEJB = (NewSessionBeanRemote) ctx.lookup("java:global/ABEJB/AJoyfulBean!EJB.NewSessionBeanRemote"); // Tried "ABS/AJoyfulBean#EJB.NewSessionBeanRemote" too

    jTextAreaInformations.setText(jTextAreaInformations.getText() + "\n" + myEJB.testConnexion());
}
catch (Exception ex)
{
    jTextAreaInformations.setText(jTextAreaInformations.getText() + "\n" + ex.toString());
}

MANIFEST.MF

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: 1.8.0_25-b18 (Oracle Corporation)
Class-Path: lib/javax.annotation-api.jar lib/jaxb-api.jar lib/webservi
 ces-api-osgi.jar lib/bean-validator.jar lib/javax.batch-api.jar lib/j
 avax.ejb-api.jar lib/javax.el.jar lib/javax.enterprise.concurrent-api
 .jar lib/javax.enterprise.concurrent.jar lib/javax.enterprise.deploy-
 api.jar lib/javax.faces.jar lib/javax.inject.jar lib/javax.intercepto
 r-api.jar lib/javax.jms-api.jar lib/javax.json.jar lib/javax.mail.jar
  lib/javax.management.j2ee-api.jar lib/javax.persistence.jar lib/java
 x.resource-api.jar lib/javax.security.auth.message-api.jar lib/javax.
 security.jacc-api.jar lib/javax.servlet-api.jar lib/javax.servlet.jsp
 -api.jar lib/javax.servlet.jsp.jar lib/javax.servlet.jsp.jstl-api.jar
  lib/javax.servlet.jsp.jstl.jar lib/javax.transaction-api.jar lib/jav
 ax.websocket-api.jar lib/javax.ws.rs-api.jar lib/javax.xml.registry-a
 pi.jar lib/javax.xml.rpc-api.jar lib/jaxb-osgi.jar lib/webservices-os
 gi.jar lib/weld-osgi-bundle.jar lib/jaxm-api.jar lib/gf-client.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: a.better.stock.UI.Accueil

当我在托管 glassfish 服务器的机器上运行我的客户端的 .jar 文件(带有 /lib 文件夹)时,我的 EJB 被联系并且正确执行所需的任务(更新 SQL 表)。 但是当我将 .jar 文件和 /lib 文件夹复制到远程机器并执行它时,它会得到这个 exception

javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory 
[Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]

所以基本上,为什么我会得到这个异常?我给出了上下文。无论如何,它适用于本地但不适用于远程客户端。奇怪的。

【问题讨论】:

    标签: java jakarta-ee netbeans glassfish ejb


    【解决方案1】:

    你如何启动你的客户端?从哪个目录?和你的本地目录一样吗?也许您的客户的班级路径不正确?甚至不完整?

    我认为可能是 lib/ 文件夹中的某些 jar 文件需要正确文件夹结构中的其他 jar。例如,您可以在 appserv-rt.jar/META-INF/MANIFEST.MF 中看到这一点。在那里你可以找到“类路径:../lib/gf-client.jar”条目。解决方案可能是您从 lib/ 文件夹或 bin/ 目录中运行您的客户端,就像 glass fish 一样。

    【讨论】:

    • 这是我的 MANIFEST 文件的内部:Manifest-Version: 1.0 Ant-Version: Apache Ant 1.9.4 Created-By: 1.8.0_25-b18 (Oracle Corporation) Class-Path: [.. .] lib/gf-client.jar X-COMMENT: Main-Class will be added by build Main-Class: a.better.stock.UI.Accueil 很抱歉演示文稿,所以编辑很糟糕
    • 从哪里调用 java 命令?我认为你应该从 /bin 目录开始你的 java 命令,你的结构可能是: - myclient/ - myclient/bin - myclient/lib/*.jar 现在你应该从 myclient/bin 目录中启动你的 java 命令,所以java可以在“../lib/*.jar”目录中找到jar。其次,您应将 jar 的清单修改为“../lib/gf-client.jar”
    • 已添加。同样的问题。
    • 当您将所有 jar 显式添加到 java -cp 参数时?
    • 尼诺,你用远程机器测试过我的答案吗?
    【解决方案2】:

    请检查您的容器 (glassfish) 是否正在侦听端口 3700。 在窗户上http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true

    netstat -a -n -o
    

    如果它正在运行,请尝试 telnet 到端口

    telnet <yourglassfishIP> 3700
    

    如果您可以键入任何内容并且 telnet 没有立即终止,则您的端口是打开的。

    如果端口开放,请检查您是否已将 glassfish 配置为接受远程 EJB 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2019-02-15
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 2015-02-04
      相关资源
      最近更新 更多