2016-05-12 45 views
1

是否可以配置Spring AMQP,以便它將自動將隊列中的消息(實質上是JSON字符串)轉換爲所需類型的對象?自動將JSON字節從RabbitMQ隊列轉換爲對象

我迄今爲止嘗試:

1)我的CFG:

<rabbit:listener-container connection-factory="rabbitConnectionFactory" message-converter="jsonMessageConverter"> 
    <rabbit:listener ref="foo" method="listen" queue-names="test_queue"/> 
</rabbit:listener-container> 
<bean id="foo" class="foo.FooListener"/> 
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"/> 

2)我的聽衆FooListener有方法listen(FooMessage foo) { ... }

3)我FooMessage只是簡單的POJO和我的test_queue中的消息只是FooMessage的序列化實例JSON格式。

java.lang.NoSuchMethodException: foo.FooListener.listen([B)

所以它並不適用於listen(byte[] msg)方法工作,春季索賠。

可以嗎?

回答

0

請閱讀documentationJackson2JsonMessageConverter。 並注意注意事項:

在1.6以前的版本中,如果類型信息不存在,轉換將失敗。從版本1.6開始,如果缺少類型信息,轉換器將使用Jackson默認值(通常是地圖)轉換JSON。

因此,獨立於POJO處理程序的目標參數類型,MessageProperties必須包含__TypeId__信息。

爲了滿足您的要求,請考慮使用@RabbitListener來代替。

查看Spring AMQP 1.6新聞的相同部分。

雖然隨意提出一個JIRA issue,我們可能會考慮一般MessageListenerAdapter一些鉤子,我們通過listener ref="foo" method="listen"知道的方法,因此,可以推斷出轉換前的目標參數類型。

+0

我是否正確理解,在我的聽衆配置方式中,這還不可能? – Andremoniy

+0

所以,問題出在我的消息的內容類型不正確 – Andremoniy

0

嗯,實際上這個東西就像是一個魅力Spring AMQP甚至在1.6版之前。問題出在我的郵件的不正確content-type,它只是text/plain

如果具有json消息中適當的方式被髮送時,說

template.convertAndSend("test_queue", "test_queue", new FooMessage("blablabla","blabla")); 

與正確安裝template

<rabbit:template id="amqpTemplate" 
        connection-factory="rabbitConnectionFactory" 
        message-converter="jsonMessageConverter" 
        /> 
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter"/> 

所以方法listen(FooMessage foo) { ... }與來自消息FooMessage類型的自動創建的對象調用。