2016-06-23 3 views
0

Я пытаюсь отправить сообщение и получить ответ, используя следующий кодне в состоянии обработать ответ, полученный от template.convertSendAndReceive()

MessageProperties props =MessagePropertiesBuilder.newInstance().setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN) 
      .setMessageId("MSG12345").setHeader("type", "type1").setCorrelationId(UUID.randomUUID().toString().getBytes()).build(); 
Message message = MessageBuilder.withBody(input.getBytes()).andProperties(props).build(); 
Message response = (Message) template.convertSendAndReceive("key", message); 

Но, его бросает ava.lang.ClassCastException: java.lang.String не может быть передан в org.springframework.amqp.core.Message

Может быть, потому что я отправляю запрос с использованием программы java (spring-amqp), а получатель - программа python (pika). Recevier отправляет мне объект JSON, выгруженный в строковый формат, но я не могу его обработать.

ответ

0

Ваша проблема, что вы используете RabbitTemplate.convertSendAndReceive():

/** 
* Basic RPC pattern with conversion. Send a Java object converted to a message to a default exchange with a 
* specific routing key and attempt to receive a response, converting that to a Java object. Implementations will 
* normally set the reply-to header to an exclusive queue and wait up for some time limited by a timeout. 
* 
* @param routingKey the routing key 
* @param message a message to send 
* @return the response if there is one 
* @throws AmqpException if there is a problem 
*/ 
Object convertSendAndReceive(String routingKey, Object message) throws AmqpException; 

Даже если ваш payload является Message и мы имеем:

protected Message convertMessageIfNecessary(final Object object) { 
    if (object instanceof Message) { 
     return (Message) object; 
    } 
    return getRequiredMessageConverter().toMessage(object, new MessageProperties()); 
} 

Он преобразует reply в целевой объект из body:

return this.getRequiredMessageConverter().fromMessage(replyMessage); 

и не возвращать Message, как и ожидалось.

Итак, вам действительно нужно отдать String и иметь дело с вашим JSON уже по своему усмотрению.

Смежные вопросы