HornetQ 在 Docker 中运行时连接被拒绝

Connection refused when HornetQ runs in Docker

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

Connection refused: connect

我确保打开了 1099 端口,我可以看到该端口已打开,

0.0.0.0:1099->1099/tcp

Telnet 到 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

您在 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 中的代理 运行ning 的主机名或 IP 地址。这是因为 connector 只是一个配置持有者(有时称为“存根”),它在执行 JNDI 查找时被传递回远程客户端。远程客户端然后使用此存根与代理建立实际的 JMS 连接。因此,connectorhostport 是客户端将使用的内容。

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

docker run -d --network host hornetq

这将使容器使用主机的网络。将 hornetq-configuration.xmlconnector 配置的 host 值设置回 localhost 后,一切都应该正常。您可以在 Docker documentation.

中阅读有关此选项的更多信息

值得注意的是,HornetQ 已经将近 5 年没有发布了。 HornetQ 代码库是 donated to the Apache ActiveMQ community in June of 2015 and is now known as ActiveMQ Artemis——来自 ActiveMQ 的下一代代理。我强烈建议迁移到 ActiveMQ Artemis 并停止使用 HornetQ。

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