Python Proton отправляет двоичные данные в Active MQ - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь записать простое строковое сообщение в очередь 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. Он сообщает о содержимом как SpESsESw�message. Я ожидал, что содержимое будет message

[Дополнительная точка данных]

Я также вижу это в отдельной программе Go, написанной мной с использованием пакета pack.ag/amqp.

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, я получаю похожее поведение, наблюдая за Su�vMy message в деталях сообщения ActiveMQ. Может ли это быть просто аномалией веб-интерфейса?

1 Ответ

0 голосов
/ 16 мая 2019

Вы должны указать привязке python, что вы хотите кодировать тело как строковое значение, добавив префикс кодировки unicode к вашей строке, чтобы привязка python знала, что делать с данными, которые вы кодируете. То, как вы в настоящее время передаете тело, приводит к двоичной кодировке, поэтому брокер покажет вам данные мусора на консоли, рассматривая их как BytesMessage вместо TextMessage

Это должно работать, если вы сделали что-то вроде следующего:

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

Подробнее о кодировании и декодировании строк Python здесь .

...