2016-06-02 2 views
2

Я пытаюсь реализовать повторную маршрутизацию сообщений с мертвой буквой, как описано в этом answer. Я использую Spring config. Я понятия не имею, как читать заголовки, чтобы получить исходный ключ маршрутизации и исходную очередь. Ниже мой конфиг:Как читать заголовок X-death сообщения с мертвой буквой RabbitMQ с использованием Spring Boot?

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

} 

ответ

2

Заголовков не доступен при использовании «старый» стиль Pojo сообщений (с MessageListenerAdapter). Вам необходимо реализовать MessageListener, который дает вам доступ к заголовкам.

Однако в этом случае вам необходимо будет вызвать преобразователь самостоятельно, и если вы используете обмен сообщениями/ответами, вы потеряете механизм ответа внутри адаптера, и вам нужно отправить ответ самостоятельно.

В качестве альтернативы вы можете использовать настраиваемый конвертер сообщений и «улучшать» преобразованный объект с заголовком после вызова стандартного конвертера.

Вместо этого используйте newer style POJO messaging с @RabbitListener - он дает вам доступ к заголовкам и имеет возможность запроса/ответа.

Вот пример:

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

    } 

} 

Результат:

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

ответ Гэри является правильным. Просто немного деталей, тип xDeath лучше быть ArrayList<HashMap<String,*>> вместо List<String> xDeath. Затем вы можете получить доступ к любому полю, выполнив что-то вроде: xDeath.first().get("count")