brithwulf
brithwulf

Reputation: 548

Get messages by property or header in RabbitMQ

I'm new in to RabbitMQ and I've faced a problem. I'm trying to get messages from queue by API method. I've made that by now I want to get messages from queue by header or property if it is possible. I read the documentation about HTTP API. I have not found such an API for filtering messages by some headers or properties.

I use that kind of API to get messages from queue:

/api/queues/vhost/name/get

and in the body:

{"count":20,"ackmode":"ack_requeue_true","encoding":"auto"}

I was thinking, maybe it is possible to somehow pass some filter in the body so it could filter and return the message what I want.

This is how my message looks like : enter image description here

I have tried to pass in the body type = "myType" or header = "myHeader"

Upvotes: 2

Views: 8498

Answers (2)

Luke Bakken
Luke Bakken

Reputation: 9627

I've made that by now I want to get messages from queue by header or property if it is possible.

RabbitMQ only delivers messages in order from a queue. There is no way to filter once a message is in a queue.

You can filter messages as they are published to an exchange, however. Use a headers exchange and bind queues based on header values. Then, each queue will contain the messages you expect and you can then consume from them.

The RabbitMQ tutorials have a section that use a "headers exchange". Use that as a guide.

Finally, only use the HTTP API for testing. It is a very inefficient way to retrieve messages.

Upvotes: 4

JammuPapa
JammuPapa

Reputation: 148

A bit late to the party, but I think you can achieve the same like this

ConnectionFactory factory = new ConnectionFactory();
factory.setHost(hostname);
Connection conn = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueBind(queueName, exchangeName, "");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
        Map<String, Object> headers = delivery.getProperties().getHeaders();
        String message = new String(delivery.getBody(), "UTF-8");
        System.out.println(" [x] Received '" + message + "', with header : " + headers.get("TestHeader") );
    };
channel.basicConsume(queue, true, deliverCallback, consumerTag -> { });

Upvotes: 1

Related Questions