2017-08-30 620 views
0

我有一個項目,我通過AMQP發送帶有簽名JSON對象的消息。在服務器端,我有以下幾點:Spring AMQP convertSendAndReceive VS sendAndReceive

public class MyServerHandler implements MessageListener{ 
... 
    @Override 
    public void onMessage(Message msg) 
    { 
     String _payload = new String(msg.getBody(), StandardCharsets.UTF_8); 
     System.out.println(_payload); 
     ... 

現在,如果我使用的方法convertSendAndReceive這樣的:

String msg = ...deo // JSON object (String) 
Object response = getRabbitOperations().convertSendAndReceive(_myExchange, _myRoutingKey, msg, 
       new MessagePostProcessor() 
       { 
        public Message postProcessMessage(Message message) throws AmqpException 
        { 
         message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT); 
         message.getMessageProperties().setRedelivered(false); 
         message.getMessageProperties().setUserId(_myUser); 
         message.getMessageProperties().setType(_myType); 
         return message; 
        } 
       } 
     ); 

當我得到了AMQP消息的內容我得到的字符串發送,但在引號:

String _payload = new String(msg.getBody(), StandardCharsets.UTF_8); 
System.out.println(_payload); 

"eyJ4NWMiOlsiTUlJRHV6Q0NBcU9nQXdJQkFnSUNDMEV3RFFZSktvWklodmNOQVFFR....." 

但是,如果我用sendAndReceive實現方法具d,我沒有得到引號:

MessageProperties mp = new MessageProperties(); 
mp.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT); 
mp.setRedelivered(false); 
mp.setUserId(_myUser); 
mp.setType(_myType); 
Message _m = new Message(msg.getBytes(), mp); 
Object _response = getRabbitOperations().sendAndReceive(_myExchange, _myRoutingKey, _m); 

在服務器端,我得到(使用相同的代碼):

eyJ4NWMiOlsiTUlJRHV6Q0NBcU9nQXdJQkFnSUNDMEV3RFFZSktvWklodmNOQVFFR..... 

這是爲什麼?我可以改變它以同樣的方式工作嗎?哪一個會是正確的? 謝謝

+0

您需要顯示其餘配置;看起來你在發送和接收端有不匹配的消息轉換器。 –

回答

0

問題sendAndReceive它直接處理消息並繞過MessageConverter。根據你的報價經驗,它看起來像是一個JSON轉換器。 您可以使用SimpleMessageConverter。但是這並不重要:如果您想清除byte[]發送,則只需爲convertSendAndReceive執行相同的msg.getBytes()

+0

謝謝Artem。是的,我有一個JSON轉換器:@Bean \t公共RabbitTemplate rabbitTemplate() \t { \t \t RabbitTemplate模板=新RabbitTemplate(simpleRoutingConnectionFactory()); \t \t template.setMessageConverter(jsonMessageConverter());但我需要它(至少現在是這樣)。如果我使用msg.getBytes(),則收到的消息與發送的消息不同,因此,現在解決方法是在收到消息後刪除服務器上的這些引號。 – jandres