a18251988255 于 2014.07.15 12:28 提问
- 两个GlassFish4.0服务器之间的远程EJB调用
-
两台服务器在不同的机器上,环境为jdk8,javaee7.
当我在一台服务器A上调用服务器B的时候,如果在普通的java main方法中调用 :InitialContext ctx = new InitialContext(); ctx.lookup("corbaname:iiop:192.168.0.210:3700#java:global/RemoteEjb/SayHelloService!rm.SayHelloServiceRemote"); Properties props = new Properties(); props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); // 远程主机名 props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.210"); // 远程主机的缺省端口号 props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); // 创建远程上下文 InitialContext ctx = new InitialContext(props); // 查找EJB,其中查找的参数为远程接口类 System.out.println("k开始连接....................."); SayHelloServiceRemote testRmi = (SayHelloServiceRemote) ctx.lookup("java:global/RemoteEjb/SayHelloService"); testRmi.say(); System.out.println("k开始连接.....................");
这样总是会调用成功.
但是如果在javaee环境中,比如说servlet或者JSF的托管Bean中总是会出现各种错误,以下是我尝试的几种方法与对应的错误:
1.采用glssfish的配置文件,并在托管bean中调(此处没有对JNDI名字做详细的记录,有误差,但是在实际测试的时候肯定是正确的)用:ctx.lookup("java:global/RemoteEJBName")
<glassfish-web-app error-url="">
<ejb-ref>
<ejb-ref-name>RemoteEJBName</ejb-ref-name>
<jndi-name>corbaname:iiop:<servername or IP>:3700#java:global/<projectname>/FooClassImpl!com.test.foo.FooClass</jndi-name>
</ejb-ref>
</glassfish-web-app>
这种总是会报找不到JNDI之类的错误.
2.在托管Bean中类似在main方法中调用的一样.
error:avax.naming.CommunicationException: Communication exception for SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=192.168.1.104, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is java.rmi.RemoteException: CORBA INITIALIZE 0 No; nested exception is:.希望有人能指点一下,在两个glssFish服务器之间进行远程调用的具体细节.先谢过了..