Amazon MQ 将 AMQP 消息转换为 JMS

Posted

技术标签:

【中文标题】Amazon MQ 将 AMQP 消息转换为 JMS【英文标题】:Amazon MQ transforming AMQP message to JMS 【发布时间】:2021-01-08 02:13:06 【问题描述】:

我有一个 Python 和 Java Spring 应用程序以 2 种方式通信。该堆栈主要基于 Java/Spring 构建,因此 ActiveMQ 和 JMS 是合乎逻辑的选择。但是,我们添加了一个需要与其余服务交互的 Python 应用程序,因此我使用了 qpid proton(AMQP 库)并在 ActiveMQ 配置中添加了以下配置以使其正常工作:

<transportConnectors>
    <transportConnector name="openwire" uri="ssl://0.0.0.0:61617?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqps" uri="amqp+ssl://0.0.0.0:5671?maximumConnections=1000&wireFormat.maxFrameSize=104857600&transport.transformer=jms"/>
</transportConnectors>

它在 ActiveMQ 上完美运行,并允许使用 AMQP 客户端发送/接收 JMS TextMessage。

很遗憾,Amazon MQ 拒绝了此配置并返回以下错误:

元素“transportConnector”上的属性“name”的值“amqp+ssl”相对于其类型“protocol”无效。和 cvc-enumeration-valid:值 'amqps' 相对于枚举 '[openwire]' 不是 facet-valid

AWS 将 Amazon MQ 作为托管 ActiveMQ 服务推销,但它们似乎缺乏功能,因为从 AMQP 到 JMS 的映射从 5.8 版开始可用:https://activemq.apache.org/amqp 并且我使用的 Amazon MQ 代理是在版本5.15.12

我尝试将 amp;transport.transformer=jmstransport.transformer=jms 标头添加到代理 URL 的查询字符串,以及在 Python 应用程序中使用 STOMP 作为协议(因为它是纯文本协议)而不是 AMQP但这些都不起作用。

那么,您知道我可以在 Python 应用程序中发送 AMQP 消息并在 Java 应用程序中接收 JMS TextMessage 的任何潜在缺失配置或其他方式吗?

【问题讨论】:

如果您只是启用 AMQPS 是否有效?亚马逊的文档说他们支持 AMQPS,但公平地说,他们没有说支持多种协议。在我看来,它只是亚马逊工具中的一个错误。在裸机上安装“真正的”ActiveMQ 可能会更快;) AMPQS 已经是默认设置。核心问题似乎是 AmazonMQ 不支持为 transportConnector => docs.aws.amazon.com/amazon-mq/latest/developer-guide/… 设置这些属性。我认为 OP 正在寻找客户端解决方案,或者没有它的解决方法。 您找到解决此问题的方法了吗?我还看到尝试使用 Java + JMS 将字节数组从 NodeJs + AMQP lambda 发送给消费者的类似问题。 【参考方案1】:

默认情况下,在开源 ActiveMQ 5.x 代码中,AMQP 传输已经默认为 JMS 转换,因此除非 Amazon 版本已更改,如果您想要入站 AMQP 的 JMS 转换,您甚至不需要显式设置消息。如果他们已更改,那么您需要与他们联系以确定如何更改该配置。

【讨论】:

确实如这里所说activemq.apache.org/amqp.html 默认行为是将 AMQP 内容包装到 JMS BytesMessage 中的本机转换。这对于接收者来说更难处理,因为它在有效负载的开头包含标头和属性,所以在接收到消息时,我必须弄清楚内容从哪里开始,这在你查看时很容易,但很难放置以通用的方式进入代码。以前,当转换器设置为jms 时,消息内容中没有标头/属性。 在这种情况下,我建议尝试 ActiveMQ Artemis,它实现了更加完善的 AMQP 协议栈并得到积极维护。

以上是关于Amazon MQ 将 AMQP 消息转换为 JMS的主要内容,如果未能解决你的问题,请参考以下文章

Rabbit MQ

架构设计:系统间通信(20)——MQ:消息协议(下)

RabbitMQ的基本概念与原理

01 消息队列介绍

01 消息队列介绍

MQ(消息队列)