JMS使用HornetQ(JBoss)在Docker容器上公开所需的端口

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

我可以成功创build任务,但不能创buildJMS上下文:

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 

我刚刚find了解决这个问题的方法。 我也正在经历它。

在你的情况下,问题是在JBossconfiguration。 在我的情况下,问题是在蜻蜓8.2。

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

我在我的wildfly中使用这个参数让他接受来自任何IP的外部连接,因为我的蜻蜓暴露在互联网上。

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

INFO [org.hornetq.jms.server](ServerService线程池 – 53)HQ121005:为“http-connector”连接器检测到的“host”值“0.0.0.0”无效。 切换到“hostname.your.server”。 如果这个新地址不正确,请手动configuration连接器以使用正确的地址。

在这种情况下,HornetQ将使用机器名称中定义的主机。 在Linux上,它将使用/ etc / hostname中定义的内容。

还有另一个问题。 因为通常主机名不是Internet上的有效主机,可以通过DNS服务parsing为IP。

然后注意你可能发生了什么事情:你的JBoss服务器计划绑定到0.0.0.0,你的HornetQ(embedded在JBoss中)试图把这个IP和它不是一个有效的IP,他采取你的主机名服务器。 当你的远程JMS客户端(你的本地networking之外的地方)在你的JBoss上build立一个loockup时,HornetQ向客户报告他必须在主机YOUR_HOSTNAME_LOCAL_SERVER上寻找HornetQ资源,但是当它试图通过DNSparsing这个名字时,他不能那么发生以下故障:

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。 (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(DefaultChann (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。连接(AbstractChannel.java:199)at io.netty.bootstrap.Bootstrap $ 2.run(Bootstrap.java:165)at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTask​​s(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)

解决这个问题的办法是configurationJBoss主机,它应该通知正在做loockup远程的客户。

在我的情况下,野蝇的设置如下。 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,因为我无法使用https为JMS执行Wildfly工作。