【问题标题】:Connection refused when HornetQ runs in Docker当 HornetQ 在 Docker 中运行时连接被拒绝
【发布时间】:2021-11-23 19:02:27
【问题描述】:

我正在测试一个非常简单的场景,我正在我的计算机上本地运行的独立服务器上运行位于examples/jms/queue 下的测试并成功。在 dockerized HornetQ 2.4.0 上运行相同的程序给了我错误:

连接被拒绝:连接

我确定打开了 1099 端口,我可以看到端口打开了,

0.0.0.0:1099->1099/tcp

Telnet-ing 到 localhost 1099 给出了一个乱码结果,这意味着那里有一些东西正在监听但运行连接到 jnp://localhost:1099 的测试,正如我所说的它失败了。

终于hornetq-beans.xml的配置:

<bean name="StandaloneServer" class="org.hornetq.jms.server.impl.StandaloneNamingServer">
   <constructor>
      <parameter>
         <inject bean="HornetQServer"/>
      </parameter>
   </constructor>
   <property name="port">1099</property>
   <property name="bindAddress">0.0.0.0</property>
   <property name="rmiPort">1098</property>
   <property name="rmiBindAddress">0.0.0.0</property>
</bean>

netstat -plunt 的结果:

# netstat -plunt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:5445            0.0.0.0:*               LISTEN      10/java
tcp        0      0 0.0.0.0:1098            0.0.0.0:*               LISTEN      10/java
tcp        0      0 0.0.0.0:1099            0.0.0.0:*               LISTEN      10/java
tcp        0      0 0.0.0.0:39437           0.0.0.0:*               LISTEN      10/java
tcp        0      0 0.0.0.0:5455            0.0.0.0:*               LISTEN      10/java

我的 Dockerfile:

FROM openjdk:8

WORKDIR /app

COPY ./hornetq-2.4.0.Final .

EXPOSE 1099 1098 5445 5455

ENTRYPOINT [ "/bin/bash", "-c", "cd bin/; ./run.sh" ]

hornetq-configuration.xml的更新部分:

<connectors>
   <connector name="netty">
      <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
      <param key="host"  value="0.0.0.0"/>
      <param key="port"  value="5445"/>
   </connector>
   
   <connector name="netty-throughput">
      <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
      <param key="host"  value="0.0.0.0"/>
      <param key="port"  value="5455"/>
      <param key="batch-delay" value="50"/>
   </connector>
</connectors>

<acceptors>
   <acceptor name="netty">
      <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
      <param key="host"  value="0.0.0.0"/>
      <param key="port"  value="5445"/>
   </acceptor>
   
   <acceptor name="netty-throughput">
      <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
      <param key="host"  value="0.0.0.0"/>
      <param key="port"  value="5455"/>
      <param key="batch-delay" value="50"/>
      <param key="direct-deliver" value="false"/>
   </acceptor>
</acceptors>

hornetq-beans.xml的更新部分:

<bean name="StandaloneServer" class="org.hornetq.jms.server.impl.StandaloneNamingServer">
   <constructor>
      <parameter>
         <inject bean="HornetQServer"/>
      </parameter>
   </constructor>
   <property name="port">1099</property>
   <property name="bindAddress">0.0.0.0</property>
   <property name="rmiPort">1098</property>
   <property name="rmiBindAddress">0.0.0.0</property>
</bean>

我用来运行镜像的命令是:

docker run -d -p 1098:1098 -p 1099:1099 -p 5445:5445 -p 5455:5455 hornetq

【问题讨论】:

  • 当你运行 `docker logs 来获取容器日志时,你得到了什么?
  • @JustinBertram 仅打开 1099 给我“连接被拒绝”,打开 1099、1098、5445、5455 给我一个“无法创建会话工厂”。
  • @NoamYizraeli 我得到“服务器现已上线”日志。
  • 如果容器中有netstat,请运行netstat -plunt 并检查正在监听哪些端口(或您拥有的其他网络命令)
  • @NoamYizraeli 我编辑了我的问题以添加命令的结果。我在运行测试时看到的另一个错误是“ERROR: HQ214016: Failed to create netty connection”

标签: docker hornetq


【解决方案1】:

hornetq-configuration.xml 中的connector 配置的0.0.0.0host 值无效。这就是代理记录的原因:

Invalid "host" value "0.0.0.0" detected for "netty" connector. Switching to "8ba14b02658a". If this new address is incorrect please manually configure the connector to use the proper one.

我认为8ba14b02658a 不是正确的host 值,这就是它继续失败的原因。因此,如日志所示,您需要为您的环境配置一个有效值。这需要是主机上的客户端可以用来连接到在 Docker 中运行的代理的主机名或 IP 地址。这是因为connector 只是一个配置持有者(有时称为“存根”),它在远程客户端执行 JNDI 查找时被传回给它。然后,远程客户端使用此存根与代理建立实际的 JMS 连接。因此,无论配置为hostportconnector 都是客户端将使用的。

更简单的选择是在运行 Docker 容器时使用 --network host,例如:

docker run -d --network host hornetq

这将使容器使用主机的网络。一旦您将connector 中的connector 配置的host 值设置回hornetq-configuration.xml 回到localhost,一切都应该正常工作。您可以在Docker documentation 中阅读有关此选项的更多信息。

值得注意的是,HornetQ 已经近 5 年没有发布了。 HornetQ 代码库是 2015 年 6 月的 donated to the Apache ActiveMQ 社区,现在被称为 ActiveMQ Artemis - ActiveMQ 的下一代代理。我强烈建议迁移到 ActiveMQ Artemis 并停止使用 HornetQ。

此外,如果您确实迁移到 ActiveMQ Artemis,您将不会遇到这个特殊问题,因为 JNDI 实现已经完全改变。不再有实际的 JNDI 服务器。 JNDI 实现是 100% 客户端,因此您只需要在 JNDI 属性中配置 URL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 2021-06-24
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多