6

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?

4 Answers 4

4

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());
            }
        }
    }
Sign up to request clarification or add additional context in comments.

4 Comments

I'm not asking how to put headers - I did that. I'm asking how to read them - since they don't have usual type(s).
Show the second paragraph: "For read the headers of Message inbound from Rabbit Queue"
Yeah, but this assumes that Object.toString() on header value is all I will ever need - are you sure this is the best / the correct way to read those values?
I have similar issue.. I am putting a String into the headers before sending, but when I receive it, it has become a LongStringHelper$ByteArrayLongString
3

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 !

Comments

1

I just cast to LongString and the convert toString()

String header = "foo";

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

Comments

0

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 

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.