автономный клиент, вызывающий удаленный EJB, работает в Ubuntu, но не в Windows - PullRequest
0 голосов
/ 09 октября 2019

Я запускаю свой клиент EJB вместе с EJB в Glassfish 5.1 в той же Windows 10. Он работает нормально. Я пытаюсь портировать glassfish на Ubuntu, но обнаружил, что он не работает, если клиент в Windows и EJB в Ubuntu (win-> ubuntu, не в порядке). Однако, если клиент в Ubuntu и EJB в Windows, это работает (ubuntu-> win, хорошо). win-> win, ок. убунту-> убунту, ок. Поэтому я надеюсь, что кто-то здесь может мне помочь.

Для тестирования вместо вызова EJB я использую Context.list() для поиска всех JNDI в glassfish, и в этом конце я приведу несколько странный результатконец.

Вот мой клиент:

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.

Во-первых, у меня есть glassfish, работающий как в Ubuntu, так и в Windows. EJB-компоненты Ubuntu используют 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

В нем перечислены все имена EJB в win glassfish без префикса. Так оно и работает.

Тогда в 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 to ubuntu, используя ubu-ip, вместо этого она дает мне список Windows EJB (то есть с префиксом). только когда я закрываю windows glassfish и повторяю команду, тогда это дает мне c.list empty.

Итак, есть две проблемы: (1) почему клиент в Ubuntu работает, а тот же клиент в Windows - нет;(2) почему после использования localhost в окнах список, похоже, остается в каком-то буфере, дальнейший доступ к Ubuntu дает мне список окон? Пожалуйста, помогите.

РЕДАКТИРОВАТЬ: Дальнейшее тестирование выявило 2 вывода: (1) Я обнаружил, что если я использую свойство java.naming.provider.url вместо org.omg.CORBA.ORBInitialHost и ....Port, оно всегда дает мне EJB локальных стекловидных объектов, даже еслиURL-адрес хоста указан правильно, не работает даже в случаях с Ubuntu-> Windows. (2) Я добавляю в тестирование еще одну Ubuntu, также с тем же Glassfish и таким же набором EJB, за исключением имен с префиксом test.. Это заставило меня пересмотреть мой результат выше. Подводя итог новому результату (клиент-> сервер = результат): ubu1-> ubu2 = ubu1 EJBs;ubu2-> ubu1 = ubu2 EJBs;ubu-any-> win = работать нормально;win-> ubu-any = win EJB. Есть идеи?

1 Ответ

0 голосов
/ 10 октября 2019

Я только что увидел, что вы делаете это:

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);

Пример взят здесь: Получение начального контекста от удаленного клиента

По крайней мере, это то, чем я занимался все годы (когда я все еще использовал удаленные EJB).

Редактировать: я думаю, что это можетТакже будет проблема, почему кажется, что записи кэшируются. IIRC, что может произойти при использовании значения по умолчанию InitialContext.

...