Tengo 2 servicios que se comunican a través de AMQP. Uno usa Javascript con amqplib para enviar un mensajeObjeto {"message":"Success"} como este:
channel.sendToQueue(queueName, Buffer.from(JSON.stringify(messageObject)));El servicio Java consume el mensaje usando spring rabbit de esta manera:
@RabbitListener(queues = QUEUE_NAME) public void receiveMessageQueue(String message) { el contenido de ese mensaje es una cadena que representa una matriz de bytes. Traté de convertirlo usando la respuesta publicada aquí Funciona para el 95% del mensaje Pero mi resultado aún contiene algunos caracteres ininteligibles. Parece que no puede traducir { y }
\u0017 "message":"Success" \fAsí que me pregunto si debería cambiar algo en el lado del remitente o en el lado del receptor. Prefiero cambiar el lado del remitente ya que tengo muchos servicios de Java que esperan que una cadena JSON lista para usar se analice en objetos y no quiero tener que actualizarlos todos y convertir los mensajes.
EDITAR Esta publicación de SO mencionada por SMA no ayudó. La cadena resultante es exactamente la misma que la entrada:
"123,34,106,111,98,73,100,34,58,34,52,54,99,51,101,100,53,54,45,49,101,52,99,45,52,101,49,101,45,97,56,55,55,45,50,55,100,54,53,102,56,50,55,48,51,48,34,44,34,109,101,115,115,97,103,101,34,58,34,83,117,99,99,101,115,115,102,117,108,108,121,32,115,117,98,109,105,116,116,101,100,32,116,111,32,112,46,118,100,115,105,116,116,64,100,105,97,108,111,103,119,111,114,107,115,46,100,101,34,125"Todo lo que puedo hacer ahora es:
private String convert(String byteString) { String[] byteValues = byteString.substring(1, byteString.length() - 1).split(","); byte[] bytes = new byte[byteValues.length]; for (int i=0, len=bytes.length; i<len; i++) { bytes[i] = Byte.parseByte(byteValues[i].trim()); } return new String(bytes).replace('\u0017','{').replace('\f','}'); }pero eso parece demasiado hackish. Parece que debería haber una solución fácil para comunicar una cadena JSON entre javascript y java usando amqp.
SOLUCIÓN
Encontré una manera de enviar el mensaje de manera que Spring Rabbit lo entienda:
channel.sendToQueue(queueName, Buffer.from(JSON.stringify(messageObject),'utf8'), {contentType:'text/plain', contentEncoding: 'UTF-8'});Aparentemente, las propiedades contentType y contentEncoding son una convención, utilizada por el consumidor de mensajes Spring Rabbit. Ahora el servicio Java obtiene la cadena JSON correcta.