向远程JMS主题发送消息

3

我正在编写一个小型工具,用于向远程服务器发送JMS消息,但是我没有正确配置InitialContext(或者看起来是这样)

初始化上下文的代码:

      Properties p = new Properties();
      p.put(Context.INITIAL_CONTEXT_FACTORY, 
            "org.jnp.interfaces.NamingContextFactory");
      p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
      p.put(Context.PROVIDER_URL, "jnp://10.10.10.10:1099/");
      Context context = new InitialContext(p);

但是当我运行它时,出现了异常:
javax.naming.CommunicationException 
[Root exception is java.rmi.ConnectException: 
Connection refused to host: 127.0.0.1; 
nested exception is: 
java.net.ConnectException: Connection refused: connect]

我感到困惑的是,尽管我将其配置为10.10.10.10(已经启动JBoss并且没有防火墙),并且可以通过端口1099获得telnet会话,但它仍然抱怨127.0.0.1。有什么指针或帮助吗?

1个回答

4

这是因为JNDI和相关协议都是回连性质的,后续请求会发送到服务器“认为”应该监听的IP地址。如果你telnet到10.10.10.10:1099并查看输出,你会看到类似以下内容:

telnet 10.10.10.10 1099
[Connection message]
[Garbage]
127.0.0.1....

原因是您的服务器正在127.0.0.1上提供服务,并将其作为JNDI位置回复。因为您(很可能)在远程机器上,当远程机器尝试连接到JBoss服务器通知它要连接的IP(127.0.0.1)时,它会尝试连接到自己,而不是JBoss服务器。
您需要使用以下命令之一启动jboss:./run.sh -b 0.0.0.0(所有IP绑定),或更改机器上的本地主机条目为10.10.10.10。
(顺便说一句,我记得我为此苦苦挣扎了很长时间,知道这是多么令人沮丧)

这看起来很有前途 :) 明天早上一定会尝试并回报。 - webclimber
是的 - 我记得几年前花了好几天时间在这上面。关键在于telnet会话中 - 如果它在结尾处显示127.0.0.1,那么这就是你的远程客户端将要连接的IP地址。你也可以使用这个来检查你的修复 - 一旦它工作正常,正确的IP地址将会被列在那里。 - Alex Taylor
像魔法一样运行良好,我必须选择单个IP,对于-b参数,在多宿主机上似乎不起作用。 - webclimber
我在使用Jboss时遇到了同样的问题,我想知道是否有更好的用户友好的配置方式。我记得当我第一次在远程机器上使用Jboss时,浪费了几天时间。我在像这样的一个群组中找到了答案。有人知道他们是否有关于此配置的帮助文档吗? - paradisonoir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接