2016-10-11 7 views
1

Order POJOを受け取るために使用しているspring AMQPを使用してメッセージリスナを作成しました。メッセージタイプはapplication/jsonですので、jacksonメッセージコンバータを設定しました。 今までのことがうまくいき、リスナーでPOJOオブジェクトを自動的に再作成する注文を取得することができます。 しかし、私はこの例を拡張し、リスナーのいくつかのメッセージプロパティをチェックしたいと考えています。したがって、私のhandleMessage()でOrder POJOを使用する代わりに、 "org.springframework.amqp.core.Message"をパラメータとして使用したいと考えています。私は後でボディを変換することができますが、このようにして、アプリケーションで使用できるすべてのメッセージ関連プロパティをリスナーで取得します。春にメッセージリスナーアダプタを使用してメッセージオブジェクトを取得するAMQP

メッセージパラメータでhandleMessage()を使用しようとしましたが、ジャックソンコンバータを使用してメッセージ本文も変換しようとしているようです。 POJOクラスのOrderを渡す場所がわからないので、ジャックソンが自分のメッセージ本文を変換することはできますが、メッセージを正しく変換できるはずです。

私のコードから抜粋してください。 私はこれについてのロードブロッキングを打ったと思うので助けてください。私が送ります

POJO

public class Order { 

private int orderid; 
private String itemDescription; 

テンプレートとCONVERTER SETTINGS

@Bean 
public RabbitTemplate rubeExchangeTemplate() { 
    logger.info("Lets test autowiring " + rabbitConnectionFactory.getHost()); 
    RabbitTemplate r = new RabbitTemplate(this.rabbitConnectionFactory); 
    r.setExchange("rmq-exchange"); 
    r.setMessageConverter(jsonMessageConverter()); 
    return r; 
} 

@Bean 
public MessageConverter jsonMessageConverter() 
{ 
    final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(); 
    converter.setClassMapper(classMapper()); 
    return converter; 
} 

@Bean 
public DefaultClassMapper classMapper() 
{ 
    DefaultClassMapper typeMapper = new DefaultClassMapper(); 
    typeMapper.setDefaultType(Order.class); 
    return typeMapper; 
} 

MESSAGE

 Message message = MessageBuilder.withBody(messageText.getBytes()) 
      .setMessageId("123") 
      .setContentType("application/json") 
      .setHeader("bar", "baz") 
      .build(); 

LISTENER(messageTextが注文POJOに準拠JSONが含まれています)

@Bean(value = "rube") 
public SimpleMessageListenerContainer listenerContainer() { 
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
    container.setConnectionFactory(cf); 
    container.setQueueNames("rmq-rube-queue"); 
    container.setMessageListener(messageListenerAdapter()); 
    return container; 
} 

@Bean 
public MessageListenerAdapter messageListenerAdapter() { 
    MessageListenerAdapter listener = new MessageListenerAdapter(pm, converter); 
    return listener; 
} 

答えて

1

この場合はMessageListenerAdapterを使用しないでください。生メッセージを取得するにはMessageListenerを実装するだけです。また

は、迅速な対応のためにあなたは、ヘッダーだけでなく、変換されたペイロードへのアクセスを得ることができnewer, annotation-based, POJO listener、...

@RabbitListener(queues = "foo") 
public void listen(MyPojo pojo, @Header("foo") String fooHeader) { ... } 
+0

おかげゲイリーを使用することを検討してください。新しいリスナーを作成することができました。これは古いアプローチよりもはるかに優れています。また、Spring MVCを使って私がどのように使い慣れているかについては、はるかに調整されています。ソリューションを手に入れることができて本当に嬉しいですが、皆さんが設計した方法にもっと喜んでいると思います。 – Pulkit

関連する問題