2016-04-25 5 views
1

Ich muss AMQP-Nachricht mit Spring decodieren. Um damit zu umgehen Ich verwende jetzt:AMQP-Nachricht als Map mit Spring entschlüsseln

// 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(); 

Und meine Zuhörer ist

public class DataListener { 

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

} 

Die Nachricht gesendet wird mit convertAndSend Methode von AmqpTemplate. AmqpTemplate wurde keine Konfiguration zugewiesen, alles ist standardmäßig.

Wie kann ich möglicherweise meine incomingMessage als HashMap Felder erhalten? Ich möchte es nicht stark an bestimmte Objekttypen koppeln.

Antwort

3

Angenommen, Sie bedeuten, dass Ihre Nachricht ist eine POJO Bohne ...

Verwenden JSON - auf der Ausgangsseite verwenden, um ein Jackson2JsonMessageConverter anstelle des Standard-SimpleMessageConverter, die Java Serialisierung verwendet.

Auf der Empfängerseite wird derselbe JSON-Konverter versuchen, den eingehenden Stream in das ursprüngliche POJO zu konvertieren.

Um dies zu vermeiden, konfigurieren Sie den JSON-Nachrichtenkonverter, um den Klassennamen einer HashMap anstelle des ursprünglichen POJO zuzuordnen.

Sie können das tun, indem Sie dem Konverter eine benutzerdefinierte DefaultJackson2JavaTypeMapper bereitstellen, die für die Zuordnung des Klassennamens von __TypeId__ zu java.util.HashMap konfiguriert ist.

EDIT

Oder Sie können einfach ein ClassMapper injizieren, die immer HashMap gibt - hier ist eine schnelle Boot-App ich die Technik zu illustrieren schrieb:

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

    } 

} 
Verwandte Themen