带有独立 ActiveMQ 的 Wildfly 上的 ActiveMQ Artemis

Posted

技术标签:

【中文标题】带有独立 ActiveMQ 的 Wildfly 上的 ActiveMQ Artemis【英文标题】:ActiveMQ Artemis on wildfly with standalone ActiveMQ 【发布时间】:2016-11-18 20:36:39 【问题描述】:

我正在尝试使用 MDB 连接 Wildfly 10 服务器,使用内置的 ActiveMQ Artemis 连接到运行版本 5.13.3 的独立 ActiveMQ-Server。 Artemis 似乎无法与任何受支持的 ActiveMQ 协议进行通信。


ActiveMQ 独立代理具有以下transportConnectors

<transportConnectors>
    <transportConnector name="auto" uri="auto://localhost:5671?protocolDetectionTimeOut=5000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="http" uri="http://0.0.0.0:8180?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600" />
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
    <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;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-Server 上收到不同的错误消息。

连接到auto-端点会产生以下消息:

错误 |无法接受连接:java.lang.IllegalStateException:无法检测到有线格式

wildfly 端没有错误。


Openwire-endpoint 的连接产生以下消息:

警告 |传输连接到:tcp://127.0.0.1:45000 失败:java.io.IOException:未知数据类型:77

这也会在 Wildfly 方面产生错误:

17:04:23,384 错误 [org.apache.activemq.artemis.core.client] (Thread-16 (ActiveMQ-client-netty-threads-1716275972)) > AMQ214013:无法解码数据包:java.lang。 IllegalArgumentException:AMQ119032:无效类型:1 在 org.apache.activemq.artemis.core.protocol.core.impl.PacketDecoder.decode(PacketDecoder.java:413) 在 org.apache.activemq.artemis.core.protocol.ClientPacketDecoder.decode(ClientPacketDecoder.java:60) 在 org.apache.activemq.artemis.core.protocol.ClientPacketDecoder.decode(ClientPacketDecoder.java:39) 在 org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImpl.bufferReceived(RemotingConnectionImpl.java:324) 在 org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl$DelegatingBufferHandler.bufferReceived(ClientSessionFactoryImpl.java:1105) 在 org.apache.activemq.artemis.core.remoting.impl.netty.ActiveMQChannelHandler.channelRead(ActiveMQChannelHandler.java:68) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294) 在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294) 在 io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846) 在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131) 在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) 在 io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized (NioEventLoop.java:468) 在 io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) 在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) 在 io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) 在 java.lang.Thread.run(Thread.java:745)

我可以继续并在所有端点上接收错误消息。结果实际上是 ActiveMQ-Artemis 以 ActiveMQ 不支持的数据格式发送。

将 ActiveMQ-Artemis 与独立的 ActiveMQ-Server 连接需要采取哪些步骤?

【问题讨论】:

你好 Faro 你能解决这个问题吗?我突然遇到了同样的问题,想知道我的环境发生了什么变化导致了这个问题。 我不得不禁用内置的 Artemis-Adapter 并部署自己的外部适配器 好吧,我最近才开始遇到这个问题,Active MQ 可以正常工作 8-9 个月,没有出现相同类型的问题 @MarcodeAbreu 你能详细说明你的决议是什么吗?也许发布它作为这个问题的答案。 请看我上面的回答“我必须禁用内置的 Artemis-Adapter 并部署自己的外部适配器”。不幸的是,我真的不记得任何进一步的细节,所以我无法发布正确的答案。 【参考方案1】:

Wildfly 10 附带 ActiveMQ Artemis,默认情况下,任何 MDB 都将使用 ActiveMQ Artemis JCA RA。 ActiveMQ Artemis JCA RA 使用仅由 ActiveMQ Artemis 代理支持的core 协议。 ActiveMQ 5.x 代理无法/不会理解此协议。

因此,如果您希望在 Wildfly 10 上运行的 MDB 使用来自 ActiveMQ 5.x 代理的消息,那么您需要部署 ActiveMQ 5.x JCA RA(它使用 ActiveMQ 5 的 OpenWire 协议.x 代理了解)并配置 MDB 以使用它(例如通过激活配置属性)。

不管怎样,ActiveMQ Artemis 代理确实支持OpenWire 协议,因此旧版 ActiveMQ 5.x 客户端可以连接到 ActiveMQ Artemis 代理。

【讨论】:

以上是关于带有独立 ActiveMQ 的 Wildfly 上的 ActiveMQ Artemis的主要内容,如果未能解决你的问题,请参考以下文章

Wildfly - 配置 ActiveMQ 以使用 Postgres 日志

如何使用 ActiveMQ Artemis 在 Wildfly 24 服务上配置 jms-queue

Wildfly-Swarm 并通过资源适配器连接到外部 activemq:WFLYCTL0412

如何在同一台机器上运行 2 个(或更多)Wildfly 实例?

WildFly中的每主机或每部署子系统配置

如何将 WildFly 连接到远程 Artemis 服务器