[英]Remote JMS connection still using localhost
我在远程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。
有任何想法吗?
干杯,
詹姆士
我在尝试为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).
你可以在这里找到更多。
您必须区分获取ConnectionFactory对象及其打开的连接。 获取ConnectionFactory对象由JNDI处理(在本例中由CORBA支持)。 获得ConnectionFactory对象后,它将使用其imqAddressList参数打开与JMS代理的连接。 默认情况下,它配置为localhost:7676,如果要打开与远程代理的连接,则必须配置正确的值。
您必须检查如何为绑定到jms / MyConnectionFactory的TopicConnectionFactory配置此参数。 有关如何在Glassfish中配置连接工厂的更多详细信息,请参阅管理JMS连接工厂和目标 。
我有一个类似的问题,从另一台机器获取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的任何(内部)组件将自动使用正确的设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.