2013-06-22 46 views
0

我已經通過spring amqp使用POJO設置了基本的請求/回覆消息,並且這些通過JSON消息轉換器通過RabbitMQ進行交換。應該將圖像在JSON消息中進行base64編碼還是在Spring AMQP中作爲BytesMessage返回?

我的迴應POJO的負載到目前爲止都是簡單的字符串,但現在我需要回復一個圖像有時。

Q1)處理這個問題的最佳方法是什麼?該圖像是否應該作爲JSON消息的有效負載字符串進行base64編碼?

Q2)是否可以簡單地將圖像作爲BytesMessage返回?

Q2.a)spring-amqp能夠處理兩個單獨的偵聽器,一個返回POJO,另一個返回BytesMessage?我想不會,但這裏的一些僞代碼周圍就是我要問:

<listener-container> 
    <listener ref="requestHandlerA" method="handleMessage" queue-names="#{requestQueue.name}" /> 
    <listener ref="requestHandlerB" method="handleMessage" queue-names="#{requestQueue.name}" /> 
</listener-container> 

public class RequestHandlerA { 
    public ResponseDelegatePojo handleMessage(RequestDelegatePojo requestDelegate) {...} 
} 
public class RequestHandlerB { 
    public BytesMessage handleMessage(RequestDelegatePojo requestDelegate) {...} 
} 

Q2.b)或者......如果消息監聽返回一個對象(可能是一個POJO有時,可能是在BytesMessage其他時間)... spring-amqp框架能夠在運行時相應地進行調整,以便有時將POJO序列化爲json,而其他時間BytesMessage 原樣爲

回答

1

這樣的兩個聽衆將無法工作 - 它只會在同一隊列中創建兩個競爭消費者。一種解決方案是使用不同的隊列(和不同的監聽器)。

如果你想使用同一個隊列兩種請求類型,可能是最簡單的解決辦法是讓你的聽衆POJO回報Object(POJO或byte[])(提取的Q2b),並使用自定義MessageConverter

自定義messageConverter會非常簡單;假設你總是JSON入站,它總是委託給JsonMessageConverterfromMessage()並在出站端(toMessage)應該委託給任何一個JsonMessageConverterSimpleMessageConverter

if (object instanceof byte[]) { 
    return this.simpleMessageConverter.toMessage(object, messageProperties); 
else { 
    return this.jsonMessageConverter.toMessage(object, messageProperties); 
} 

SimpleMessageConverter將設置contentType屬性到application/octet-stream但你可以改變,如果你想調用其toMessage方法(message.getMessageProperties().setContentType(...);

相關問題