2016-10-11 1 views
1

Ich habe einen Nachrichten-Listener mit dem Spring AMQP erstellt, mit dem ich einen POJO-Auftrag erhalte. Der Nachrichtentyp ist application/json und so habe ich einen jackson message converter eingerichtet. Bis jetzt sind die Dinge gut und ich bin in der Lage, die Bestellung POJO Objekt automatisch in meinem Hörer neu erstellt zu bekommen. Allerdings möchte ich dieses Beispiel erweitern und einige Nachrichteneigenschaften in meinem Listener überprüfen. Anstatt also mein Order POJO in meinem handleMessage() zu verwenden, möchte ich "org.springframework.amqp.core.Message" als Parameter verwenden. Ich kann dann später den Körper konvertieren, aber auf diese Weise werde ich alle nachrichtenbezogenen Eigenschaften in meinem Listener haben, die ich in meiner Anwendung verwenden kann.Nachrichtenobjekt über den Message Listener Adapter im Frühjahr empfangen AMQP

Ich habe versucht, die HandleMessage() mit Message-Parameter, aber es scheint, dass es versucht, den Nachrichtentext auch mithilfe von Jackson-Konverter zu konvertieren. Ich bin mir nicht sicher, wohin die Order-POJO-Klasse gehen soll, die jackson verwenden kann, um meinen Nachrichtentext zu konvertieren, aber trotzdem in der Lage sein sollte, die Nachricht korrekt zu konvertieren.

Hier finden Sie die wichtigen Snippets aus meinem Code. Bitte helfen Sie mir, wie ich denke, ich habe eine Straßensperre auf diesem gefunden.

POJO

public class Order { 

private int orderid; 
private String itemDescription; 

Schablone und Konvertern ab

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

Botschaft, die ich sende (Message die JSON-konform mit dem Auftrag POJO enthält)

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

LISTENER

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

Antwort

1

Verwenden Sie keine MessageListenerAdapter in diesem Fall, implementieren Sie einfach MessageListener, um die rohe Nachricht zu erhalten.

Alternativ betrachten die newer, annotation-based, POJO listener verwenden, wo Sie Zugriff auf Header sowie die konvertierte Nutzlast ...

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

Dank Gary für die schnelle Antwort zu bekommen. Ich konnte den neuen Hörer wie von dir vorgeschlagen erstellen. Das ist so viel besser als der alte Ansatz. Außerdem ist es so viel mehr daran ausgerichtet, wie ich es gewohnt bin, Dinge mit Spring MVC zu machen. Ich bin wirklich glücklich, die Lösung zu bekommen, aber ich denke, ich bin mehr glücklich über die Art und Weise, wie ihr es entworfen habt. – Pulkit

Verwandte Themen