2016-10-11 53 views
1

我已經使用spring AMQP創建了一個消息偵聽器,我正在使用它來接收一個Order POJO。消息類型是application/json,所以我建立了一個jackson消息轉換器。 直到現在事情工作正常,我能夠在我的偵聽器中自動重新創建訂單POJO對象。 但是我想擴展這個例子,並希望檢查我的偵聽器中的一些消息屬性。因此,而不是在我的handleMessage()中使用我的Order POJO,我想使用「org.springframework.amqp.core.Message」作爲參數。然後,我可以稍後轉換主體,但通過這種方式,我將在我的應用程序中使用我的偵聽器中的所有與消息相關的屬性。在春天使用消息偵聽器適配器獲取消息對象AMQP

我嘗試使用帶Message參數的handleMessage(),但它似乎試圖轉換郵件正文,以及使用傑克遜轉換器。我不知道在哪裏傳遞POJO類的傑克遜可以用來轉換我的消息正文,但仍應該能夠正確地轉換消息。

請從下面的代碼中找到重要的片段。 請幫助我,因爲我認爲我在這方面遇到了障礙。

POJO

public class Order { 

private int orderid; 
private String itemDescription; 

模板轉換器設置

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

消息,該消息我送(MessageText中包含了JSON與訂單POJO兼容)

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

回答

1

在這種情況下不要使用MessageListenerAdapter,只需執行MessageListener即可獲取原始消息。

另外,可以考慮使用newer, annotation-based, POJO listener,在那裏你可以訪問頭以及轉換的有效載荷...

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

感謝加里的快速反應。我能夠按照您的建議創建新的聽衆。這比舊的方法好得多。另外,它與我習慣於使用Spring MVC做的事情更加一致。我很高興能夠獲得解決方案,但我認爲我對你們設計它的方式感到更高興。 – Pulkit