带有独立 ActiveMQ 的 wildfly 上的 ActiveMQ Artemis
ActiveMQ Artemis on wildfly with standalone ActiveMQ
我正在尝试使用 MDB
连接 wildfly 10 服务器,使用内置的 ActiveMQ Artemis 连接到我的独立 ActiveMQ-Server 运行 版本 5.13.3。似乎 Artemis 无法与任何受支持的 ActiveMQ 协议通信。
ActiveMQ 独立代理 具有以下 transportConnectors
:
<transportConnectors>
<transportConnector name="auto" uri="auto://localhost:5671?protocolDetectionTimeOut=5000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="http" uri="http://0.0.0.0:8180?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600" />
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
Wildfly MessageBean 具有以下 Annotation
:
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", "TestDestination"),
@ActivationConfigProperty(propertyName="clientID", propertyValue = "test"),
@ActivationConfigProperty(propertyName="connectionParameters", propertyValue = "host=127.0.0.1;port=5671"),
@ActivationConfigProperty(propertyName="connectorClassName", propertyValue = "org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory"),
@ActivationConfigProperty(propertyName="acknowledgeMode", propertyValue="Auto-acknowledge")
}, mappedName = "TestDestination")
public class MessageProcessingBean implements MessageListener {
根据我选择连接的连接器,我在 ActiveMQ 服务器上收到不同的错误消息。
连接到 auto
端点会产生以下消息:
ERROR | Could not accept connection : java.lang.IllegalStateException: Could not detect the wire format
wildfly 端没有错误。
与 Openwire
端点的连接产生以下消息:
WARN | Transport Connection to: tcp://127.0.0.1:45000 failed: java.io.IOException: Unknown data type: 77
这也会在 wildfly 端产生错误:
17:04:23,384 ERROR [org.apache.activemq.artemis.core.client] (Thread-16 (ActiveMQ-client-netty-threads-1716275972)) > AMQ214013: Failed to decode packet: java.lang.IllegalArgumentException: AMQ119032: Invalid type: 1
at org.apache.activemq.artemis.core.protocol.core.impl.PacketDecoder.decode(PacketDecoder.java:413)
at org.apache.activemq.artemis.core.protocol.ClientPacketDecoder.decode(ClientPacketDecoder.java:60)
at org.apache.activemq.artemis.core.protocol.ClientPacketDecoder.decode(ClientPacketDecoder.java:39)
at org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImpl.bufferReceived(RemotingConnectionImpl.java:324)
at org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl$DelegatingBufferHandler.bufferReceived(ClientSessionFactoryImpl.java:1105)
at org.apache.activemq.artemis.core.remoting.impl.netty.ActiveMQChannelHandler.channelRead(ActiveMQChannelHandler.java:68)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:112)
at java.lang.Thread.run(Thread.java:745)
我可以继续下去并在所有端点上收到错误消息。结果实际上是 ActiveMQ-Artemis 正在发送 ActiveMQ 不支持的数据格式。
必须采取哪些步骤才能将 ActiveMQ-Artemis 与独立的 ActiveMQ-Server 连接?
Wildfly 10 附带 ActiveMQ Artemis,默认情况下任何 MDB 都将使用 ActiveMQ Artemis JCA RA。 ActiveMQ Artemis JCA RA 使用仅受 ActiveMQ Artemis 代理支持的 core
协议。 ActiveMQ 5.x 代理无法t/won 理解该协议。
因此,如果您希望 Wildfly 10 上的 MDB 运行 使用来自 ActiveMQ 5.x 代理的消息,那么您需要部署 ActiveMQ 5.x JCA RA(其中使用 ActiveMQ 5.x 代理理解的 OpenWire
协议)并配置 MDB 以使用该协议(例如,通过激活配置属性)。
值得一提的是,ActiveMQ Artemis 代理确实支持 OpenWire
协议,因此旧版 ActiveMQ 5.x 客户端可以连接到 ActiveMQ Artemis 代理。
我正在尝试使用 MDB
连接 wildfly 10 服务器,使用内置的 ActiveMQ Artemis 连接到我的独立 ActiveMQ-Server 运行 版本 5.13.3。似乎 Artemis 无法与任何受支持的 ActiveMQ 协议通信。
ActiveMQ 独立代理 具有以下 transportConnectors
:
<transportConnectors>
<transportConnector name="auto" uri="auto://localhost:5671?protocolDetectionTimeOut=5000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="http" uri="http://0.0.0.0:8180?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600" />
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
Wildfly MessageBean 具有以下 Annotation
:
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", "TestDestination"),
@ActivationConfigProperty(propertyName="clientID", propertyValue = "test"),
@ActivationConfigProperty(propertyName="connectionParameters", propertyValue = "host=127.0.0.1;port=5671"),
@ActivationConfigProperty(propertyName="connectorClassName", propertyValue = "org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory"),
@ActivationConfigProperty(propertyName="acknowledgeMode", propertyValue="Auto-acknowledge")
}, mappedName = "TestDestination")
public class MessageProcessingBean implements MessageListener {
根据我选择连接的连接器,我在 ActiveMQ 服务器上收到不同的错误消息。
连接到 auto
端点会产生以下消息:
ERROR | Could not accept connection : java.lang.IllegalStateException: Could not detect the wire format
wildfly 端没有错误。
与 Openwire
端点的连接产生以下消息:
WARN | Transport Connection to: tcp://127.0.0.1:45000 failed: java.io.IOException: Unknown data type: 77
这也会在 wildfly 端产生错误:
17:04:23,384 ERROR [org.apache.activemq.artemis.core.client] (Thread-16 (ActiveMQ-client-netty-threads-1716275972)) > AMQ214013: Failed to decode packet: java.lang.IllegalArgumentException: AMQ119032: Invalid type: 1 at org.apache.activemq.artemis.core.protocol.core.impl.PacketDecoder.decode(PacketDecoder.java:413) at org.apache.activemq.artemis.core.protocol.ClientPacketDecoder.decode(ClientPacketDecoder.java:60) at org.apache.activemq.artemis.core.protocol.ClientPacketDecoder.decode(ClientPacketDecoder.java:39) at org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImpl.bufferReceived(RemotingConnectionImpl.java:324) at org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl$DelegatingBufferHandler.bufferReceived(ClientSessionFactoryImpl.java:1105) at org.apache.activemq.artemis.core.remoting.impl.netty.ActiveMQChannelHandler.channelRead(ActiveMQChannelHandler.java:68) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:112) at java.lang.Thread.run(Thread.java:745)
我可以继续下去并在所有端点上收到错误消息。结果实际上是 ActiveMQ-Artemis 正在发送 ActiveMQ 不支持的数据格式。
必须采取哪些步骤才能将 ActiveMQ-Artemis 与独立的 ActiveMQ-Server 连接?
Wildfly 10 附带 ActiveMQ Artemis,默认情况下任何 MDB 都将使用 ActiveMQ Artemis JCA RA。 ActiveMQ Artemis JCA RA 使用仅受 ActiveMQ Artemis 代理支持的 core
协议。 ActiveMQ 5.x 代理无法t/won 理解该协议。
因此,如果您希望 Wildfly 10 上的 MDB 运行 使用来自 ActiveMQ 5.x 代理的消息,那么您需要部署 ActiveMQ 5.x JCA RA(其中使用 ActiveMQ 5.x 代理理解的 OpenWire
协议)并配置 MDB 以使用该协议(例如,通过激活配置属性)。
值得一提的是,ActiveMQ Artemis 代理确实支持 OpenWire
协议,因此旧版 ActiveMQ 5.x 客户端可以连接到 ActiveMQ Artemis 代理。