2016-06-02 3 views
2

私は、このanswerで説明されているように、デッドレターメッセージの再ルーティングを実装しようとしています。私はSpringの設定を使用しています。元のルーティングキーと元のキューを取得するためにヘッダーを読み取る方法はわかりません。以下は私の設定です:Spring Bootを使用してRabbitMQデッドレターメッセージのx-deathヘッダーを読み取る方法は?

@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

ヘッダは(MessageListenerAdapter付き)「古い」スタイルのPOJOメッセージングを使用して利用できません。ヘッダーへのアクセスを提供する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")

関連する問題