Удаленное соединение JMS все еще использует localhost - PullRequest
2 голосов
/ 26 марта 2010

Я создал фабрику соединений JMS на удаленном сервере 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.

Есть идеи?

Приветствия

Джеймс

Ответы [ 3 ]

4 голосов
/ 26 апреля 2010

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

127.0.0.1 glassfish localhost.localdomain localhost

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

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

Вы можете узнать больше здесь .

2 голосов
/ 23 ноября 2010

У меня была похожая проблема с получением ресурсов 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, будет автоматически использовать правильные настройки.

2 голосов
/ 26 марта 2010

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

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

...