【问题标题】:Required ports for JMS using HornetQ (JBoss) to expose on docker container使用 HornetQ (JBoss) 在 docker 容器上公开的 JMS 所需的端口
【发布时间】:2015-05-08 22:16:00
【问题描述】:

我正在使用 Docker 将 JMS 服务器容器链接到另一个 JMS 客户端容器。但是当我在 docker 容器中运行服务器时,客户端无法正确连接到服务器。我在 docker 上暴露了 443 端口(还有其他 JMS 使用的端口吗?)

我可以成功创建目的地,但不能创建 JMS 上下文:

String PROVIDER_URL = "https-remoting://MYDOMAIN:443";
...

/** PASSED **/
Destination destination = (Destination) namingContext.lookup(destinationString);

/** HAS ERROR **/
JMSContext context = connectionFactory.createContext(username, password)

这是错误:

java.nio.channels.UnresolvedAddressException
    at sun.nio.ch.Net.checkAddress(Net.java:123)
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:621)
    at io.netty.channel.socket.nio.NioSocketChannel.doConnect(NioSocketChannel.java:176)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.connect(AbstractNioChannel.java:169)
    at io.netty.channel.DefaultChannelPipeline$HeadHandler.connect(DefaultChannelPipeline.java:1008)
    at io.netty.channel.DefaultChannelHandlerContext.invokeConnect(DefaultChannelHandlerContext.java:495)
    at io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:480)
    at io.netty.channel.ChannelOutboundHandlerAdapter.connect(ChannelOutboundHandlerAdapter.java:47)
    at io.netty.channel.CombinedChannelDuplexHandler.connect(CombinedChannelDuplexHandler.java:168)
    at io.netty.channel.DefaultChannelHandlerContext.invokeConnect(DefaultChannelHandlerContext.java:495)
    at io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:480)
    at io.netty.channel.ChannelDuplexHandler.connect(ChannelDuplexHandler.java:50)
    at io.netty.channel.DefaultChannelHandlerContext.invokeConnect(DefaultChannelHandlerContext.java:495)
    at io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:480)
    at io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:465)
    at io.netty.channel.DefaultChannelPipeline.connect(DefaultChannelPipeline.java:847)
    at io.netty.channel.AbstractChannel.connect(AbstractChannel.java:199)
    at io.netty.bootstrap.Bootstrap$2.run(Bootstrap.java:165)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
    at java.lang.Thread.run(Thread.java:745)

Exception in thread "main" javax.jms.JMSRuntimeException: Failed to create session factory
    at org.hornetq.jms.client.JmsExceptionUtils.convertToRuntimeException(JmsExceptionUtils.java:98)
    at org.hornetq.jms.client.HornetQConnectionFactory.createContext(HornetQConnectionFactory.java:149)
    at org.hornetq.jms.client.HornetQConnectionFactory.createContext(HornetQConnectionFactory.java:130)
    at com.wpic.uptime.Client.main(Client.java:100)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: javax.jms.JMSException: Failed to create session factory
    at org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:673)
    at org.hornetq.jms.client.HornetQConnectionFactory.createContext(HornetQConnectionFactory.java:140)
    ... 7 more
Caused by: HornetQNotConnectedException[errorType=NOT_CONNECTED message=HQ119007: Cannot connect to server(s). Tried with all available servers.]
    at org.hornetq.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:905)
    at org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:669)
    ... 8 more

【问题讨论】:

  • 请包含用于启动每个容器的命令。
  • 没那么容易!我在 docker 上有一个 nginx 反向代理,一个 Wildfly 服务器,它只是将端口 8080 暴露给这个反向代理服务器。

标签: jakarta-ee jboss jms docker wildfly


【解决方案1】:

我刚刚找到了解决这个问题的方法。我也经历过。

在您的情况下,问题出在 JBoss 配置中。就我而言,问题出在 Wildfly 8.2 中。

您可能在 JBoss 中使用以下参数: jboss.bind.address = 0.0.0.0

我在 Wildfly 中使用此参数让他接受来自任何 IP 的外部连接,因为我的 Wildfly 暴露在 Internet 上。

问题是,如果你没有指定 JBoss/Wildfly 设置,HornetQ 应该向执行远程锁定的 JMS 客户端报告哪个 IP,HornetQ 将假定 IP 是 jboss.bind.address 中设置的 IP。在这种情况下,它将认为 0.0.0.0 不是有效的 IP。您可能会在其日志 JBoss 中看到以下消息:

INFO [org.hornetq.jms.server] (ServerService 线程池 -- 53) HQ121005:检测到“http-connector”的“主机”值“0.0.0.0”无效 连接器。切换到“hostname.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.runAllTask​​s(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 应该通知正在执行远程锁定的客户的主机。

在我的例子中,wildfly 的设置如下。必须更改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>

<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,因为我无法将 Wildfly 与 https 一起用于 JMS。

【讨论】:

  • http-connector 定义的 http-remote-jms 引用了一个 socket-binding 条目,而不是套接字绑定组中的出站套接字绑定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2021-11-16
  • 2016-04-10
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多