我正在尝试向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
答案 0 :(得分:1)
这不是网络异常,如果您在openwire协议下收到消息,则会看到与在网页上看到的相同的内容。 ActiveMQ似乎对消息有效负载内的属性进行了编码,因此开始时会有那些奇怪的字符。我的假设是ActiveMQ会对您在主体开始时在网页右上方看到的这些属性进行编码:
此外,如果要使用基于文本的协议(例如OpenWire或STOMP)发送消息,则在正文开头将看不到任何属性或奇怪的字节。
有3种可能的解决方案:
如果您想继续使用ActiveMQ
<transportConnectors>
<transportConnector name="amqp" uri="amqp://localhost:5672?transport.transformer=jms"/>
</transportConnectors>
在ActiveMQ配置中以便将AMQP消息转换为JMS TextMessages。但是,如果您正在使用AWS的托管ActiveMQ服务Amazon MQ,则此配置当前不可用。因此,请打开票证,以便他们优先处理此事。
如果您不介意使用其他代理,则可以使用ActiveMQ
我知道这个问题已有一年多了,但是我希望这对您有所帮助!
答案 1 :(得分:0)
您需要通过在字符串中添加unicode编码前缀来告诉python绑定您要将主体编码为String值,以便python绑定知道如何处理要编码的数据。您当前传递主体的方式将导致二进制编码,因此代理将在控制台上向您显示垃圾数据,因为它将其视为BytesMessage而不是TextMessage
如果您执行以下操作,它应该可以工作:
sender.send(Message(body=u"message"))
有关python字符串编码和解码here的更多信息。