远程JMS连接仍使用localhost

时间:2010-03-26 08:26:48

标签: java glassfish jms

我在远程glassfish服务器上创建了一个JMS连接工厂,并希望从我本地计算机上的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();

这似乎有效,当我从glassfish服务器删除ConnectionFactory时,我得到一个异常,表明无法按预期找到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管理控制台中看到它们。

如果你问我在我的本地glassfish实例上没有jms / MyConnectionFactory,它只能在远程服务器上使用。

我无法看到我在这里做错了什么以及它为什么要尝试使用localhost。

有什么想法吗?

干杯,

詹姆斯

3 个答案:

答案 0 :(得分:4)

我在尝试对EJB进行远程JNDI查找时遇到了类似的问题。问题是在我的/ 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).

您可以找到更多here

答案 1 :(得分:2)

您必须区分获取ConnectionFactory对象及其打开的连接。获取ConnectionFactory对象由JNDI处理(在本例中由CORBA支持)。获取ConnectionFactory对象后,它将使用其imqAddressList参数打开与JMS代理的连接。默认情况下,它配置为localhost:7676,如果要打开与远程代理的连接,则必须配置正确的值。

您必须检查如何为绑定到jms / MyConnectionFactory的TopicConnectionFactory配置此参数。有关如何在Glassfish中配置连接工厂的更多详细信息,请参阅Administering JMS Connection Factories and Destinations

答案 2 :(得分:2)

我遇到类似的问题,从另一台机器获取JMS资源,然后是运行GlassFish的机器(在我的情况下是v3.0.1)。

为了让它发挥作用我做了以下事情:

  • 确保将JMS主机设置为服务器计算机的主机名(默认为localhost)。 [配置 - > Java消息服务 - > JMS主机]
  • 正如Matej建议的那样,请确保imqAddressList属性使用相同的主机名。 [Resources-> Connectors-> Connector Connection Pool-> 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的任何(内部)组件将自动使用正确的设置。

相关问题