我刚刚找到了这个问题的解决方案。我也在经历它。
在您的情况下,问题出在 JBoss 配置中。就我而言,问题出在 Wildfly 8.2 中。
您可能在 JBoss 中使用以下参数:
jboss.bind.地址 = 0.0.0.0
我在我的 Wildfly 中使用这个参数,让他接受来自任何 IP 的外部连接,因为我的 Wildfly 暴露在互联网上。
问题是,如果您没有指定 JBoss/Wildfly 设置,HornetQ 应向正在执行远程查找的 JMS 客户端报告哪个 IP,HornetQ 将假定该 IP 是 jboss.bind.address 中设置的 IP。在这种情况下,将认为 0.0.0.0 不是有效的 IP。您可能会在 JBoss 日志中看到以下消息:
信息 [org.hornetq.jms.server](ServerService 线程池 - 53)
HQ121005:“http-connector”检测到无效的“主机”值“0.0.0.0”
连接器。切换到“主机名.your.server”。如果这个新地址是
不正确,请手动配置连接器以使用正确的
一。
在这种情况下,HornetQ 将使用机器名称中定义的主机。例如,在 Linux 上,它将使用 /etc/hostname 中定义的内容。
还有一个问题。因为通常主机名不是互联网上的有效主机,可以通过 DNS 服务解析为 IP。
然后注意您可能发生的情况:您的 JBoss 服务器计划绑定到 0.0.0.0,您的 HornetQ(嵌入在 JBoss 中)正在尝试获取此 IP,但它不是一个有效的 IP,他正在获取您的主机名服务器。当您的远程 JMS 客户端(位于本地网络之外)在您的 JBoss 上进行查找时,HornetQ 会向客户端报告他必须在主机 YOUR_HOSTNAME_LOCAL_SERVER 上寻找 HornetQ 资源,但是当它尝试通过 DNS 解析此名称时,他不能然后出现如下故障:
java.nio.channels.UnresolvedAddressException
在 sun.nio.ch.Net.checkAddress(Net.java:123)
在sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:621)
在 io.netty.channel.socket.nio.NioSocketChannel.doConnect(NioSocketChannel.java:176)
在 io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.connect(AbstractNioChannel.java:169)
在 io.netty.channel.DefaultChannelPipeline$HeadHandler.connect(DefaultChannelPipeline.java:1008)
在 io.netty.channel.DefaultChannelHandlerContext.invokeConnect(DefaultChannelHandlerContext.java:495)
在io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:480)
在 io.netty.channel.ChannelOutboundHandlerAdapter.connect(ChannelOutboundHandlerAdapter.java:47)
在 io.netty.channel.CombinedChannelDuplexHandler.connect(CombinedChannelDuplexHandler.java:168)
在 io.netty.channel.DefaultChannelHandlerContext.invokeConnect(DefaultChannelHandlerContext.java:495)
在io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:480)
在 io.netty.channel.ChannelDuplexHandler.connect(ChannelDuplexHandler.java:50)
在 io.netty.channel.DefaultChannelHandlerContext.invokeConnect(DefaultChannelHandlerContext.java:495)
在io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:480)
在 io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:465)
在 io.netty.channel.DefaultChannelPipeline.connect(DefaultChannelPipeline.java:847)
在io.netty.channel.AbstractChannel.connect(AbstractChannel.java:199)
在 io.netty.bootstrap.Bootstrap$2.run(Bootstrap.java:165)
在io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354)
在io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)
在io.netty.util.concurrent.SingleThreadEventExecutor $2.run(SingleThreadEventExecutor.java:101)
在 java.lang.Thread.run(Thread.java:745)
问题的解决方案是配置 JBoss,它应该向进行远程查找的客户通知哪个主机。
就我而言,野蝇的设置如下。必须更改standalone.xml 文件:
<subsystem xmlns="urn:jboss:domain:messaging:2.0">
<hornetq-server>
<security-enabled>true</security-enabled>
<journal-file-size>102400</journal-file-size>
<connectors>
<http-connector name="http-connector" socket-binding="http-remote-jms">
<param key="http-upgrade-endpoint" value="http-acceptor"/>
</http-connector>
</connectors>
...
</hornetq-server>
</subsystem>
AND
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
...
<outbound-socket-binding name="http-remote-jms">
<remote-destination host="YOUR_REAL_HOSTNAME" port="${jboss.http.port:8080}"/>
</outbound-socket-binding>
</socket-binding-group>
请注意,我没有使用 https,因为我无法在 JMS 中使用 https 进行 Wildfly 工作。