Я запускаю свой клиент 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. Есть идеи?