正如标题所说,我无法从远程机器上联系我的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]
所以基本上,为什么我得到这个例外?我正在给出背景。无论如何,它适用于本地但不适用于远程客户端。奇怪的。
答案 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调用。