0

I am trying to write a simple string message to an ActiveMQ queue:

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()

The message gets to the queue just fine, but it appears to have some binary data in it when I view it on the ActiveMQ web UI. It reports the contents as SpESsESw�message. I was expecting the contents to just be message

[Additional data point]

I am also seeing this in a separate Go program I have written using the pack.ag/amqp package.

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
}

When I send a different message to ActiveMQ, I get similar behavior, seeing Su�vMy message in the ActiveMQ Message Details. Could this just be a web UI anomaly?

Paul Waldo
  • 1,131
  • 10
  • 26

2 Answers2

1

It is not a web anomaly, if you receive the message under the openwire protocol, you'll see the same thing as you see on the webpage. It seems that ActiveMQ encodes the properties inside the message payload so there are those weird characters at the start. My hypothesis is that ActiveMQ encodes these properties you see at the top right of the webpage at the start of the body:

AMQP properties

Furthermore, if you were to send a message with text-based protocols like OpenWire or STOMP, you won't see any properties nor weird bytes at the start of the body.

There are 3 potential solutions to this issue:

If you want to keep using ActiveMQ

  • As said here, you can add
<transportConnectors>
   <transportConnector name="amqp" uri="amqp://localhost:5672?transport.transformer=jms"/>
</transportConnectors>

inside the ActiveMQ configuration so AMQP messages are transformed into JMS TextMessages. However, if you're using the managed ActiveMQ service of AWS, Amazon MQ, this configuration is currently not available. So please open a ticket so they prioritize this.

  • Use a text-based protocol instead of AMQP such as OpenWire or STOMP

If you don't mind using another broker then ActiveMQ

  • Consider switching to RabbitMQ where AMQP is a first-class citizen.

I know the question is over a year old, but I hope this will still be helpful!

0

You need to tell the python binding that you want to encode the body as a String value by adding the unicode encoding prefix to you string so that the python binding knows what to do with the data you are encoding. The way you are currently handing off the body is resulting in a binary encoding instead and so the broker will show you the garbage data on the console as it views this as a BytesMessage instead of a TextMessage

It should work if you did something like the following:

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

More on python string encoding and decoding here.

Tim Bish
  • 17,475
  • 4
  • 32
  • 42
  • Tim, I tried that , using `sender.send(Message(body=u"message"))`. I still got the same binary prefix. – Paul Waldo May 16 '19 at 18:43
  • Does the message arrive at the destination with the expected body? – Tim Bish May 16 '19 at 20:26
  • No, it still is `SpESsESw�message` – Paul Waldo May 16 '19 at 20:42
  • I think you may be seeing 'headers' being copied over into the body. ActveMQ can do lots of different things with headers [here](http://activemq.apache.org/amqp). May pay to check what you are doing with the headers too. – mrT Aug 12 '20 at 04:46