【问题标题】:Remote JMS connection still using localhost远程 JMS 连接仍使用 localhost
【发布时间】:2011-02-01 02:07:17
【问题描述】:

我在远程 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。

有什么想法吗?

干杯,

詹姆斯

【问题讨论】:

    标签: java glassfish jms


    【解决方案1】:

    我在尝试对 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

    【讨论】:

      【解决方案2】:

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

      为了让它工作,我做了以下工作:

      • 确保将 JMS 主机设置为服务器计算机的主机名(默认为 localhost)。 [配置->Java消息服务->JMS主机]
      • 按照 Matej 的建议,确保 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 的(内部)组件都将自动使用正确的设置。

      【讨论】:

        【解决方案3】:

        您必须区分获取 ConnectionFactory 对象和它打开的连接。获取 ConnectionFactory 对象由 JNDI 处理(在这种情况下由 CORBA 支持)。获得 ConnectionFactory 对象后,它将使用其imqAddressList 参数打开与 JMS 代理的连接。默认情况下,它被配置为 localhost:7676,如果你想打开到远程代理的连接,你必须配置一个适当的值。

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

        【讨论】:

        • 感谢您的帮助。我在我的 ConnectionPoolFactory 上添加了 AddressList 现在我收到以下错误:org.omg.CORBA.COMM_FAILURE:vmcid:SUN 次要代码:201 已完成:没有任何想法?
        • 更多信息,我现在可以在远程 glassfish 服务器的管理页面上看到动态主题,但前提是我运行的是 glassfish 的本地实例。如果没有运行本地版本,我会从我之前的评论中得到异常。
        • 我在使用 3.1.2.2 Glassfish 服务器时遇到了这个问题,我已经准备好尖叫了。我已经使用 gf-client.jar 和 appclient.jar 构建了一个远程客户端,我按照 Oracle 在 docs.oracle.com/cd/E26576_01/doc.312/e24930/… 的建议构建了它。我遵循了 Arnoud 的建议和您的建议。它似乎正在连接到正确的主机/端口,但我收到一个奇怪的 NumberFormatException:警告:[C4003]:连接创建时出错 [10.20.10.207:3700]。 - 原因:java.lang.NumberFormatException:对于输入字符串:。任何想法为什么?
        猜你喜欢
        • 2020-09-13
        • 2015-01-25
        • 2014-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多