独立客户端调用远程EJB可以在Ubuntu中工作,但不能在Windows中工作

时间:2019-10-09 08:11:08

标签: windows ubuntu glassfish ejb jndi

我在同一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-iplocalhost时,两个命令都可以工作,即没有前缀的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。有想法吗?

1 个答案:

答案 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。