Python Proton将二进制数据发送到Active MQ

时间:2019-05-16 17:32:02

标签: python activemq qpid

我正在尝试向ActiveMQ队列写一条简单的字符串消息:

def write_to_amq(message, host_name, port, queue):
    conn = BlockingConnection(f'{host_name}:{port}')
    sender = conn.create_sender(queue)
    sender.send(Message(body='message'))
    conn.close()

该消息很好地进入队列,但是当我在ActiveMQ Web UI上查看该消息时,似乎其中包含一些二进制数据。它将内容报告为SpESsESw�message。我期望内容只是message

2 个答案:

答案 0 :(得分:1)

这不是网络异常,如果您在openwire协议下收到消息,则会看到与在网页上看到的相同的内容。 ActiveMQ似乎对消息有效负载内的属性进行了编码,因此开始时会有那些奇怪的字符。我的假设是ActiveMQ会对您在主体开始时在网页右上方看到的这些属性进行编码:

AMQP properties

此外,如果要使用基于文本的协议(例如OpenWire或STOMP)发送消息,则在正文开头将看不到任何属性或奇怪的字节。

有3种可能的解决方案:

如果您想继续使用ActiveMQ

  • here所述,您可以添加
<transportConnectors>
   <transportConnector name="amqp" uri="amqp://localhost:5672?transport.transformer=jms"/>
</transportConnectors>
在ActiveMQ配置中

以便将AMQP消息转换为JMS TextMessages。但是,如果您正在使用AWS的托管ActiveMQ服务Amazon MQ,则此配置当前不可用。因此,请打开票证,以便他们优先处理此事。

  • 使用基于文本的协议代替OpenQ或STOMP之类的AMQP

如果您不介意使用其他代理,则可以使用ActiveMQ

  • 考虑改用RabbitMQ,其中AMQP是一等公民。

我知道这个问题已有一年多了,但是我希望这对您有所帮助!

答案 1 :(得分:0)

您需要通过在字符串中添加unicode编码前缀来告诉python绑定您要将主体编码为String值,以便python绑定知道如何处理要编码的数据。您当前传递主体的方式将导致二进制编码,因此代理将在控制台上向您显示垃圾数据,因为它将其视为BytesMessage而不是TextMessage

如果您执行以下操作,它应该可以工作:

sender.send(Message(body=u"message"))

有关python字符串编码和解码here的更多信息。