2016-06-02 5 views
2

Ich versuche, das Umleiten von Nachrichten mit Leads zu implementieren, wie in dieser answer beschrieben. Ich verwende Spring-Konfiguration. Ich habe keine Ahnung, wie man die Header liest, um den ursprünglichen Routing-Schlüssel und die ursprüngliche Warteschlange zu erhalten. Das Folgende ist meine config:Wie X-Death-Header einer RabbitMQ Nachricht mit Dead-Lettern mit Spring Boot lesen?

@Configuration 
public class NotifEngineRabbitMQConfig { 
    @Bean 
    public MessageHandler handler(){ 
     return new MessageHandler(); 
    } 
    @Bean 
    public Jackson2JsonMessageConverter messageConverter(){ 
     return new Jackson2JsonMessageConverter(); 
    } 
    @Bean 
    public MessageListenerAdapter messageListenerAdapter(){ 
     return new MessageListenerAdapter(handler(), messageConverter()); 
    } 

    /** 
    * Listens for incoming messages 
    * Allows multiple queue to listen to 
    * */ 
    @Bean 
    public SimpleMessageListenerContainer simpleMessageListenerContainer(){ 
     SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
     container.addQueueNames(QUEUE_TO_LISTEN_TO.split(",")); 
     container.setMessageListener(messageListenerAdapter()); 
     container.setConnectionFactory(rabbitConnectionFactory()); 
     container.setDefaultRequeueRejected(false); 
     return container; 
    } 

    @Bean 
    public ConnectionFactory rabbitConnectionFactory(){ 
     CachingConnectionFactory factory = new CachingConnectionFactory(HOST); 
     factory.setUsername(USERNAME); 
     factory.setPassword(PASSWORD); 
     return factory; 
    } 

} 

Antwort

2

Die Header sind nicht verfügbar "alten" Stil Pojo Messaging (mit MessageListenerAdapter). Sie müssen MessageListener implementieren, die Ihnen Zugriff auf die Header ermöglicht.

Allerdings müssen Sie in diesem Fall den Konverter selbst aufrufen, und wenn Sie die Anfrage/Antwort-Nachrichten verwenden, verlieren Sie den Antwortmechanismus innerhalb des Adapters und Sie müssen die Antwort selbst senden.

Alternativ können Sie einen benutzerdefinierten Nachrichtenkonverter verwenden und das konvertierte Objekt mit dem Header nach dem Aufrufen des Standardkonverters "erweitern".

Verwenden Sie stattdessen die newer style POJO messaging mit @RabbitListener - es gibt Ihnen Zugriff auf die Header und verfügt über Anfrage/Antwort-Funktion.

Hier ist ein Beispiel:

@SpringBootApplication 
public class So37581560Application { 

    public static void main(String[] args) { 
     SpringApplication.run(So37581560Application.class, args); 
    } 

    @Bean 
    public FooListener fooListener() { 
     return new FooListener(); 
    } 

    public static class FooListener { 

     @RabbitListener(queues="foo") 
     public void pojoListener(String body, 
        @Header(required = false, name = "x-death") List<String> xDeath) { 
      System.out.println(body + ":" + (xDeath == null ? "" : xDeath)); 
     } 

    } 

} 

Ergebnis:

Foo:[{reason=expired, count=1, exchange=, time=Thu Jun 02 08:44:19 EDT 2016, routing-keys=[bar], queue=bar}] 
0

Gary Antwort ist die richtige. Nur ein kleines Detail, der Typ von xDeath ist besser ArrayList<HashMap<String,*>> statt List<String> xDeath. Dann können Sie auf jedes Feld zugreifen, indem Sie Folgendes tun: xDeath.first().get("count")