无法从远程计算机联系EJB

时间:2015-01-27 14:32:20

标签: java java-ee netbeans glassfish ejb

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

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

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

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

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

这是它的样子: 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>

更好的股票”是我在远程计算机上的Java应用程序。在属性&gt;来源,“源/二进制格式是 JDK 7 。在属性&gt;库中,我添加了来自NetBeans的”来自GlassFish的Java EE“库和来自Glassfish安装的”gf-client.jar“ repertory.Java Platform设置为“ 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文件夹复制到远程机器并执行它时,它会得到异常

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

所以基本上,为什么我得到这个例外?我正在给出背景。无论如何,它适用于本地但不适用于远程客户端。奇怪的。

2 个答案:

答案 0 :(得分:1)

你如何开始你的客户?从哪个目录?与本地目录相同?也许可能是你客户的班级路径不正确?甚至不完整?

我认为可能是lib /文件夹中的某些jar文件需要正确文件夹结构中的其他jar文件。你可以在例如appserv-rt.jar / META-INF / MANIFEST.MF中看到它。在那里你可以找到&#34; Class-Path:../ lib / gf-client.jar&#34;条目。解决方案可能是你在lib /文件夹中运行你的客户端,或者像bin fish那样在bin /目录中运行你的客户端。

答案 1 :(得分:0)

请检查您的容器(玻璃鱼)是否正在侦听端口3700。 在Windows 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调用。