'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?
Solution 1:[1]
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());
}
}
}
Solution 2:[2]
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 !
Solution 3:[3]
I just cast to LongString and the convert toString()
String header = "foo";
String value = ((LongString) message.getProps().getHeaders().get(header)).toString();
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | dmotta |
| Solution 2 | Vincent F |
| Solution 3 | jmccure |
