我在同一Windows 10中将我的EJB客户端与EJB一起在Glassfish 5.1中运行。它运行良好。我正在尝试将glassfish移植到Ubuntu,但是发现如果Windows中的客户端和Ubuntu中的EJB不起作用(win-> ubuntu,不行)。但是,如果在Ubuntu中使用客户端,在Windows中使用EJB,则它可以工作(ubuntu-> win,确定)。赢->赢,好。 ubuntu-> ubuntu,好。所以我希望这里有人可以帮助我。
为了进行测试,我没有使用EJB,而是使用Context.list()
查找了玻璃鱼中的所有JNDI,最后我会提到一些奇怪的结果。
这是我的客户:
package test;
public class TestJNDI {
public static void main(String[] args) throws Exception {
System.setProperty("org.omg.CORBA.ORBInitialHost", args[0]);
Context c = new InitialContext();
NamingEnumeration<NameClassPair> ne = c.list("");
if (!ne.hasMore()) {
System.out.println("c.list empty");
return;
}//end if
while (ne.hasMore()) {
NameClassPair ncp = ne.next();
String name = ncp.getName();
System.out.println(name+"="+ncp.getClassName());
}//end while
}//end main
}//end class
我尝试包含
之类的内容System.setProperty("java.naming.factory.initial",
"com.sun.enterprise.naming.SerialInitContextFactory");
和其他,但没有一个有帮助。客户端在Windows中编译成testJNDI.jar
并移植到Ubuntu。
首先,我在ubuntu和Windows中都运行着glassfish。 Ubuntu EJB像mappedName
一样使用@Singleton(mappedName = "StockFacade")
。 Windows具有相同的EJB集,但是所有名称都以win.
开头的@Singleton(mappedName = "win.StockFacade")
前缀
然后我在命令行中运行客户端。在Ubuntu中
java -cp testJNDI.jar:/home/me/glassfish5-1/glassfish/lib/gf-client.jar test.TestJNDI win-ip
它列出了win glassfish中的所有EJB名称,没有前缀。这样就可以了。
然后在Windows中
java -cp testJNDI.jar;d:\glassfish5-1\glassfish\lib\gf-client.jar test.TestJNDI ubu-ip
说c.list empty
。所以它行不通。
当我用win-ip
替换上面的ubu-ip
和localhost
时,两个命令都可以工作,即没有前缀的ubuntu列表,有前缀的windows列表。奇怪的是,一旦执行完此命令,然后重复第二个命令:使用ubu-ip
的windows到ubuntu命令,它就会给我Windows EJB列表(即带前缀)。仅当我关闭Windows glassfish并重复命令时,它才会给我c.list empty
。
所以有两个问题:(1)为什么Ubuntu中的客户端可以工作而Windows中的同一客户端却不能工作? (2)为什么在Windows中使用localhost
后,列表似乎仍保留在某种缓冲区中,对Ubuntu的进一步访问使我获得了Windows列表?请帮忙。
编辑:进一步的测试揭示了2个发现:
(1)我发现,如果我使用属性java.naming.provider.url
而不是org.omg.CORBA.ORBInitialHost
和....Port
,即使正确指定了主机URL,它也总是给我本地glassfish的EJB,即使在ubuntu-> windows案例。
(2)我在测试中添加了另一个ubuntu,也使用相同的glassfish和相同的EJB集,但名称的前缀为test.
,这使我修改了上面的结果。总结新结果(客户端->服务器=结果):ubu1-> ubu2 = ubu1 EJB; ubu2-> ubu1 = ubu2 EJB; ubu-any-> win =工作正常; win-> ubu-any = Win EJB。有想法吗?
答案 0 :(得分:0)
我只看到你这样做:
System.setProperty("org.omg.CORBA.ORBInitialHost", args[0]);
Context c = new InitialContext();
我认为您应该将这些属性传递给InitialContext
构造函数。
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", "127.0.0.1");
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext(props);
示例取自Obtaining initial context from remote client
至少这就是我多年来(当我仍在使用远程EJB时)所做的事情。
编辑:我认为这也可能是为什么似乎缓存了条目的问题。使用默认的InitialContext
时可能会发生IIRC。