Удаленное соединение JMS все еще использует localhost

Я создал JMS Connection Factory на удаленном сервере Glassfish и хочу использовать этот сервер из клиентского приложения java на моем локальном компьютере. У меня есть следующая конфигурация для получения контекста и фабрики соединений:

Properties env = new Properties();
env.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
env.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
env.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
env.setProperty("org.omg.CORBA.ORBInitialHost", JMS_SERVER_NAME);
env.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

initialContext = new InitialContext(env);
TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) initialContext.lookup("jms/MyConnectionFactory");
topicConnection =  topicConnectionFactory.createTopicConnection();

topicConnection.start();

Кажется, это работает, и когда я удаляю ConnectionFactory с сервера Glassfish, я получаю исключение, указывающее, что не удается найти jms / MyConnectionFactory, как ожидалось.

Однако, когда я впоследствии использую свой topicConnection для получения темы, он пытается подключиться к localhost: 7676 (это не удается, поскольку я не использую Glassfish локально).

Если я создаю тему динамически:

TopicSession pubSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = pubSession.createTopic(topicName);
TopicPublisher publisher = pubSession.createPublisher(topic);
Message mapMessage = pubSession.createTextMessage(message);
publisher.publish(mapMessage);

и сервер Glassfish не работает локально, но я получаю отказ в том же соединении, однако, если я запускаю свой локальный сервер Glassfish, темы создаются локально, и я могу видеть их в консоли администратора Glassfish.

Если вы спросите, у меня нет jms / MyConnectionFactory на моем локальном экземпляре Glassfish, он доступен только на удаленном сервере.

Я не понимаю, что я здесь делаю не так и почему он вообще пытается использовать localhost.

Любые идеи?

Ваше здоровье,

Джеймс


person James    schedule 26.03.2010    source источник


Ответы (3)


Я столкнулся с аналогичной проблемой при попытке выполнить удаленный поиск JNDI для EJB. Проблема заключалась в том, что в моем файле / etc / hosts имя машины было сопоставлено с локальным хостом примерно так:

127.0.0.1 glassfish localhost.localdomain localhost

Чтобы найти ресурс, выполняются два подключения. Во-первых, нужно определить местоположение сервера, который вы должны искать. Второй использует этот IP-адрес для поиска. В вашем случае первое соединение возвращает localhost (127.0.0.1). Ваше приложение пытается подключиться к localhost для поиска и не может, потому что Glassfish не работает локально. Чтобы исправить это, убедитесь, что ваш хост-файл выглядит примерно так:

127.0.0.1 localhost
192.168.1.10 glassfish  //(or what ever your server name is).

Дополнительную информацию можно найти здесь .

person Robert    schedule 26.04.2010

Вы должны различать получение объекта ConnectionFactory и соединения, которые он открывает. Получение объекта ConnectionFactory обрабатывается JNDI (в данном случае при поддержке CORBA). После получения объекта ConnectionFactory он использует свой imqAddressList , чтобы открыть соединение с брокером (-ами) JMS. По умолчанию он настроен на localhost: 7676, и вам необходимо настроить правильное значение, если вы хотите открывать соединения с удаленными брокерами.

Вы должны проверить, как этот параметр настроен для этой TopicConnectionFactory, привязанной к jms / MyConnectionFactory. См. Администрирование фабрик соединений JMS и назначений для подробнее о том, как настроить фабрики соединений в Glassfish.

person Matej    schedule 26.03.2010
comment
Спасибо за помощь. Я добавил AddressList в свой ConnectionPoolFactory, теперь я получаю следующее сообщение об ошибке: org.omg.CORBA.COMM_FAILURE: vmcid: второстепенный код SUN: 201 завершено: Нет Есть идеи? - person James; 26.03.2010
comment
Более подробная информация: теперь я могу видеть динамические темы на административных страницах удаленного сервера Glassfish, но только если я запускаю локальный экземпляр Glassfish. Без запущенной локальной версии я получаю исключение из моего предыдущего комментария. - person James; 26.03.2010
comment
У меня была эта проблема с сервером Glassfish 3.1.2.2, и я готов кричать. Я создал удаленный клиент с gf-client.jar и appclient.jar, который я создал после предложения Oracle на docs.oracle.com/cd/E26576_01/doc.312/e24930/. Я следил за предложениями Арну и вашими предложениями. Кажется, он подключается к правильному хосту / порту, но я получаю странное исключение NumberFormatException: ПРЕДУПРЕЖДЕНИЕ: [C4003]: Произошла ошибка при создании подключения [10.20.10.207:3700]. - причина: java.lang.NumberFormatException: Для входной строки :. Есть идеи, почему? - person kpenrose; 12.04.2013

У меня была аналогичная проблема с получением ресурсов JMS с другой машины, а не с машины, на которой запущено GlassFish (v3.0.1 в моем случае).

Чтобы заставить его работать, я сделал следующее:

  • Убедитесь, что хост JMS был настроен на имя хоста серверного компьютера (по умолчанию localhost). [Конфигурация-> Служба сообщений Java-> Хосты JMS]
  • Как предложил Матей, убедитесь, что свойство imqAddressList использует то же имя хоста. [Ресурсы-> Коннекторы-> Пул соединений коннекторов-> yourJmsConnectionFactory]
  • Вместо того, чтобы затем настраивать свойства в объекте Properties и передавать этот объект в InitialContext, я устанавливаю их как свойства JVM. Такие свойства могут быть предоставлены при запуске вашего приложения (java -Dorg.omg.CORBA.ORBInitialHost=myServerHost ...) или через код (System.setProperty("org.omg.CORBA.ORBInitialHost","myServerHost");).

Последняя мера для меня была необходима, потому что при загрузке ресурсов JMS какой-то внутренний класс (com.sun.enterprise.naming.factory.AdministeredObjectFactory и, возможно, другие) создал новый InitialContext без учета предоставленных мной свойств. Этот недавно созданный InitialContext по-прежнему ссылался на localhost, а не на myServerHost.

Установка свойств как свойств JVM работает, потому что InitialContext по умолчанию принимает во внимание соответствующий набор свойств JVM. Любой (внутренний) компонент, который создает новый InitialContext, автоматически использует правильные настройки.

person Arnoud    schedule 23.11.2010