korda
korda

Reputation: 822

How to read headers in RabbitMQ in Java?

I have some properties that I would like to read from previously set message headers. I did this:

 Delivery delivery = consumer.nextDelivery();
 Map<String, Object> headers = delivery.getProperties().getHeaders();

Problem is, headers have weird types - like LongString for example. Is there any helper class that would allow me to easily convert headers to anything more useful?

Upvotes: 6

Views: 10890

Answers (4)

Slipcod
Slipcod

Reputation: 1

I apologize for the necroposting, but I was looking for an answer to a similar question and this works for me personally:

Object o = event.getProperties().getHeaders().get("stringHeader");

String stringHeader;
if(Objects.nonNull(o)){
   stringHeader  = o.toString();
}else {
   stringHeader  = "";
}

...some stringHeader usege 

Upvotes: 0

jmccure
jmccure

Reputation: 1249

I just cast to LongString and the convert toString()

String header = "foo";

String value = ((LongString) message.getProps().getHeaders().get(header)).toString();

Upvotes: 1

Vincent F
Vincent F

Reputation: 7331

That's how I've been able to do it, I am casting to LongString and then convert to String :

protected String extractCorrelationIdFromHeaders(AMQP.BasicProperties properties) throws UnsupportedEncodingException {

    String decodedCorrelationId=null;

    if(properties.getHeaders() != null) {

        try {
            Object rawCorrelationId = properties.getHeaders().get(CORRELATION_ID_KEY);

            if(rawCorrelationId==null){
                log.info("no correlationId provided in headers");
                return null;
            }

            byte[] correlationIdAsByteArray = ((LongString) rawCorrelationId).getBytes();

            decodedCorrelationId = new String(correlationIdAsByteArray, "UTF-8");
        }
        catch(UnsupportedEncodingException e){
            log.warn("extracted correlationId, but unable to decode it",e);
        }
    }

    return decodedCorrelationId;
}

Strangely enough, I feel it's not very well documented out there. Hope this helps !

Upvotes: 3

dmotta
dmotta

Reputation: 1903

You must put Headers in your Message:

MessageProperties props = MessagePropertiesBuilder.newInstance().setContentType(MessageProperties.CONTENT_TYPE_JSON).build();
props.setHeader("headerKey1", "headerValue1");

Message msg = new Message("{'body':'value1','body2':value2}".getBytes(), props);        

rabbitTemplate.send("exchange.direct.one", new String(), msg);

For read the headers of Message inbound from Rabbit Queue:

import org.springframework.amqp.core.Message;
    import org.springframework.amqp.core.MessageListener;

    public class MessagesHandler implements MessageListener {

        public void onMessage(Message message) {
            Map<String, Object> headers = message.getMessageProperties().getHeaders();
            for (Map.Entry<String, Object> header : headers.entrySet())
            {
                System.out.println(header.getKey() + " : " + header.getValue());
            }
        }
    }

Upvotes: 4

Related Questions