2016-04-25 7 views
1

Springを使用してAMQPメッセージをデコードする必要があります。それを処理するために、私が今使用します。 Springを使用したマップとしてのAMQPメッセージのデコード

// Configure queue. 
    RabbitAdmin admin = new RabbitAdmin(cf); 
    Queue queue = new Queue(queueName); 
    admin.declareQueue(queue); 
    FanoutExchange exchange = new FanoutExchange(exchangeName); 
    admin.declareExchange(exchange); 
    admin.declareBinding(BindingBuilder.bind(queue).to(exchange)); 

    // set up the listener and container 
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf); 

    MessageListenerAdapter adapter = new MessageListenerAdapter(listener); 
    container.setMessageListener(adapter); 
    container.setQueueNames(queueName); 
    container.start(); 
そして、私のリスナーが

public class DataListener { 

    public void handleMessage(Object incomingMessage) { 
     LOGGER.error("AMQP: got message.{}", incomingMessage); 
    } 

} 

あるメッセージがAmqpTemplateのconvertAndSendメソッドを使用して送信されます。 AmqpTemplateには設定はありません。デフォルトはすべてです。

私はincomingMessageをフィールドのHashMapとしてどのように受け取ることができますか?私はそれを特定のオブジェクトタイプに強く結合させたくありません。 ...あなたは、あなたのメッセージはPOJO Beanです意味

使用JSONを想定し

答えて

3

- アウトバウンド側ではなく、Javaのシリアル化を使用するデフォルトSimpleMessageConverterJackson2JsonMessageConverterを使用しています。

受信側では、同じJSONコンバータが着信ストリームを元のPOJOに変換しようとします。

これを避けるには、元のPOJOの代わりにクラス名をHashMapにマッピングするようにJSONメッセージコンバータを設定します。

ヘッダーのクラス名をjava.util.HashMapにマップするように構成されたカスタムDefaultJackson2JavaTypeMapperをコンバーターに提供すると、これを行うことができます。

EDIT

それとも、単にいつもHashMapを返すClassMapperを注入することができます - ここでクイックブートアプリケーションだ私は技術を説明するために書いた:

@SpringBootApplication 
public class So36837736Application { 

    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext context = SpringApplication.run(So36837736Application.class, args); 
     context.getBean(RabbitTemplate.class).convertAndSend(new Foo("bar")); 
     Thread.sleep(10000); 
     context.close(); 
    } 

    @Bean 
    public RabbitTemplate template(ConnectionFactory connectionFactory) { 
     RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 
     rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); 
     rabbitTemplate.setRoutingKey(queue().getName()); 
     return rabbitTemplate; 
    } 

    @Bean 
    public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) { 
     SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory); 
     container.setQueues(queue()); 
     MessageListenerAdapter adapter = new MessageListenerAdapter(new Object() { 

      @SuppressWarnings("unused") 
      public void handleMessage(Map<String, Object> map) { 
       System.out.println("\n\n\n" + map + "\n\n\n"); 
      } 

     }); 
     Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter(); 
     ClassMapper classMapper = new ClassMapper() { 

      @Override 
      public void fromClass(Class<?> clazz, MessageProperties properties) { 
      } 

      @Override 
      public Class<?> toClass(MessageProperties properties) { 
       return HashMap.class; 
      } 

     }; 
     messageConverter.setClassMapper(classMapper); 
     adapter.setMessageConverter(messageConverter); 
     container.setMessageListener(adapter); 
     return container; 
    } 

    @Bean 
    public Queue queue() { 
     return new AnonymousQueue(); 
    } 

    public static class Foo { 

     private final String bar; 

     private Foo(String bar) { 
      this.bar = bar; 
     } 

     public String getBar() { 
      return this.bar; 
     } 

    } 

} 
関連する問題