Дополнительные символы добавлены в сообщения rabbitmq

Я пытаюсь работать над простым экземпляром rabbitMQ производителя и потребителя.

public void newCustomerToQueue(Custom custom) throws Exception{

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
    CustomWrap custom= new CustomWrap();
    custom.setname(custom.getname());

    String jsonString;
    try {
        jsonString = new ObjectMapper().writeValueAsString(custom);
       // System.out.println(jsonString);
    } catch (IOException e) {
        throw new RuntimeException(e); //todo
    }


    try {
        channel.basicPublish("",TASK_QUEUE_NAME, null, SerializationUtils.serialize(jsonString));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(" [x] Sent '" + jsonString + "'");     
}

И мой класс приема выглядит следующим образом:

public void ReceiveLead() throws Exception{

    final String TASK_QUEUE_NAME = "task_queue";
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    final com.rabbitmq.client.Connection connection = factory.newConnection();
    final Channel channel = connection.createChannel();

    channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
    channel.basicQos(1);

    final Consumer consumer = new DefaultConsumer(channel) {

        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

            String message = new String(body, "UTF-8");
            System.out.println("Recieved" +message);

            try {
              byte[] body1 = message.getBytes();
              System.out.println("inside"+new String(body1));

            doWork(body1);

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                System.out.println(" [x] Done");
                channel.basicAck(envelope.getDeliveryTag(), false);
            }          
        }
    };

    channel.basicConsume(TASK_QUEUE_NAME, false, consumer);   

}

Проблема в том, что когда я получаю это конкретное сообщение, в мою строку добавляются дополнительные символы. Пример: Полученный '?? t = {"Имя": "строка"} ' Может кто-нибудь, пожалуйста, помогите мне, я не могу понять, почему это происходит !!

Вероятно, это происходит из-за того, что вы используете SerializationUtils.serialize. Попробуйте преобразовать строку в байты: jsonString.getBytes()

Sergii Zhevzhyk 17.09.2018 11:03

В этом случае он генерирует исключение java.io.UnsupportedEncodingException: и мое сообщение никогда не передается получателю

Aarika 17.09.2018 11:14

Вам нужно использовать ту же кодировку jsonString.getBytes(Charset.forName("UTF-8"));

Sergii Zhevzhyk 17.09.2018 11:18

Спасибо, теперь работает :)

Aarika 17.09.2018 11:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
1 126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Строку с полезной нагрузкой нужно преобразовать в массив байтов в кодировке UTF-8:

jsonString.getBytes(Charset.forName("UTF-8"));

SerializationUtils.serialize не следует использовать в этом случае, поскольку он добавляет дополнительные метаданные о сериализованном объекте.

Другие вопросы по теме