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