2015-11-24 2 views
3

У меня есть некоторые свойства, которые я хотел бы прочитать из ранее заданных заголовков сообщений. Я сделал это:Как читать заголовки в RabbitMQ на Java?

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

Проблема в том, что у заголовков странные типы - например, LongString. Есть ли вспомогательный класс, который позволит мне легко конвертировать заголовки в что-нибудь более полезное?

ответ

1

Вы должны поместить заголовки в своем сообщении:

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

Для чтения заголовков входящего сообщения из очереди Rabbit:

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()); 
      } 
     } 
    } 
+0

Я не спрашиваю, как поставить заголовки - я сделал это. Я спрашиваю, как их читать - поскольку у них нет обычного типа (ов). – korda

+0

Покажите второй абзац: «Для чтения заголовков входящего сообщения из очереди кролика» – dmotta

+0

Да, но это предполагает, что Object.toString() для значения заголовка - это все, что мне когда-либо понадобится - уверены ли вы, что это лучший/правильный способ прочитать эти значения? – korda

1

Вот как я был в состоянии сделать это, я литье в LongString, а затем преобразовать в строку:

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; 
} 

Как ни странно, я чувствую, что это не очень хорошо документированы там. Надеюсь это поможет !

Смежные вопросы