我在远程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。
有什么想法吗?
干杯,
詹姆斯
答案 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)。
为了让它发挥作用我做了以下事情:
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的任何(内部)组件将自动使用正确的设置。