【问题标题】:Python Proton sending binary data to Active MQPython Proton 将二进制数据发送到 Active MQ
【发布时间】:2019-10-04 01:02:21
【问题描述】:

我正在尝试将简单的字符串消息写入 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

[附加数据点]

我还在使用 pack.ag/amqp 包编写的单独 Go 程序中看到了这一点。

func (s *amqpSender) SendResult(data string) error {
    session, err := s.client.NewSession()
    if err != nil {
        return fmt.Errorf("failure creating AMQP session: %s", err)
    }

    ctx := context.Background()
    sender, err := session.NewSender(
        amqp.LinkTargetAddress(s.workQueueName),
    )
    if err != nil {
        return fmt.Errorf("failure creating sender link: %s", err)
    }

    ctx, cancel := context.WithTimeout(ctx, s.timeout)
    defer func() {
        cancel()
        sender.Close(ctx)
    }()

    err = sender.Send(ctx, amqp.NewMessage([]byte(data)))
    if err != nil {
        return fmt.Errorf("failure sending message: %s", err)
    }

    return nil
}

当我向 ActiveMQ 发送不同的消息时,我会得到类似的行为,在 ActiveMQ 消息详细信息中看到Su�vMy message。这可能只是 Web UI 异常吗?

【问题讨论】:

  • 你解决了这个家伙吗,我在 2020 年 4 月遇到了同样的问题
  • 对不起,@FelipeBuccioni 我没有。从那以后我转移到其他项目并且不记得解决方案(如果有的话)

标签: python go activemq qpid


【解决方案1】:

这不是网络异常,如果你在openwire协议下收到消息,你会看到和你在网页上看到的一样的东西。似乎 ActiveMQ 对消息有效负载中的属性进行了编码,因此一开始就有那些奇怪的字符。我的假设是 ActiveMQ 对您在正文开头的网页右上角看到的这些属性进行编码:

此外,如果您要使用 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,则此配置当前不可用。所以请开一张票,以便他们优先处理。

  • 使用基于文本的协议而不是 AMQP,例如 OpenWire 或 STOMP

如果您不介意使用其他代理,那么 ActiveMQ

  • 考虑切换到 RabbitMQ,其中 AMQP 是一等公民。

我知道这个问题已经有一年多了,但我希望这仍然会有所帮助!

【讨论】:

    【解决方案2】:

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

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

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

    更多关于python字符串编码和解码here.

    【讨论】:

    • 蒂姆,我试过了,使用sender.send(Message(body=u"message"))。我仍然有相同的二进制前缀。
    • 消息是否以预期的正文到达目的地?
    • 不,还是SpESsESw�message
    • 我认为您可能会看到“标题”被复制到正文中。 ActveMQ 可以使用标头 here 做很多不同的事情。也可以付费检查您对标头的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2012-09-10
    • 2010-11-16
    • 2015-10-24
    • 1970-01-01
    • 2013-12-29
    相关资源
    最近更新 更多