Выбрать главу

Jackson2JsonMessageConverter—Ковертирует объекты В и ИЗ JSON используя  Jackson 2 JSON processor

MarshallingMessageConverter—Конвертирует используя Spring Marshaller и Unmarshaller

SerializerMessageConverter—Ковертирует  String aи нативные объекты любого типа используя Spring-овый Serializer и Deserializer абстракции

SimpleMessageConverter - преобразует строки, байтовые массивы и Serializable типы.

ContentTypeDelegatingMessageConverter - делегирует другому MessageConverter на основе заголовка contentType.

MessagingMessageConverter - делегирует базовый MessageConverter для преобразования сообщений и AmqpHeaderConverter для заголовков.

Если вам нужно изменить конвертер сообщений, все, что вам нужно сделать, это настроить bean-компонент типа MessageConverter. Например, для преобразования сообщений на основе JSON вы можете настроить конвертер Jackson2JsonMessageConver следующим образом:

@Bean

public MessageConverter messageConverter() {

    return new Jackson2JsonMessageConverter();

}

Автоконфигурация Spring Boot обнаружит этот bean-компонент и вставит его в RabbitTemplate вместо конвертера сообщений по умолчанию.

НАСТРОЙКА СВОЙСТВ СООБЩЕНИЙ

Как и в случае с JMS, вам может потребоваться установить некоторые заголовки в отправляемых вами сообщениях. Например, допустим, вам нужно отправить X_ORDER_SOURCE для всех заказов, представленных через веб-сайт Taco Cloud. При создании ваших собственных объектов Message вы можете установить заголовок через экземпляр MessageProperties, который вы передаете конвертеру сообщений. Возвращаясь к методу sendOrder() из листинга 8.5, вам понадобится всего одна дополнительная строка кода для установки заголовка:

public void sendOrder(Order order) {

    MessageConverter converter = rabbit.getMessageConverter();

    MessageProperties props = new MessageProperties();

    props.setHeader("X_ORDER_SOURCE", "WEB");

    Message message = converter.toMessage(order, props);

    rabbit.send("tacocloud.order", message);

}

Однако при использовании convertAndSend() у вас нет быстрого доступа к объекту MessageProperties. В этом вам может помочь MessagePostProcessor:

@Override

public void sendOrder(Order order) {

    rabbit.convertAndSend("tacocloud.order.queue", order,

            new MessagePostProcessor() {

    @Override

    public Message postProcessMessage(Message message)

            throws AmqpException {

       MessageProperties props = message.getMessageProperties();

       props.setHeader("X_ORDER_SOURCE", "WEB");

       return message;

    }

    });

}

Здесь вы предоставляете convertAndSend() анонимной внутренней реализацией MessagePostProcessor. В методе postProcessMessage() вы извлекаете свойства MessageProperties из сообщения и затем вызываете setHeader(), чтобы установить заголовок X_ORDER_SOURCE.

Теперь, когда вы увидели, как отправлять сообщения с помощью RabbitTemplate, давайте переключимся на код, который получает сообщения из очереди RabbitMQ.

8.2.3 Получение сообщения от RabbitMQ

Вы видели, что отправка сообщений с помощью RabbitTemplate не сильно отличается от отправки сообщений с помощью JmsTemplate. И, как выясннится, получение сообщений из очереди RabbitMQ не сильно отличается от JMS.

Как и в случае с JMS, у вас есть два варианта:

-Получение сообщений из очереди с помощью RabbitTemplate

-Отправка сообщений в методе, аннотированным @RabbitListener.

Давайте начнем с рассмотрения pull-овского  метода RabbitTemplate.receive(), основанного на извлечении.

ПОЛУЧЕНИЕ СООБЩЕНИЙ С RABBITTEMPLATE

RabbitTemplate поставляется с несколькими методами для извлечения сообщений из очереди. Несколько наиболее полезных из них перечислены здесь:

// Получение сообщений

Message receive() throws AmqpException;

Message receive(String queueName) throws AmqpException;

Message receive(long timeoutMillis) throws AmqpException;

Message receive(String queueName, long timeoutMillis) throws AmqpException;

// Получать объекты, преобразованные из сообщений

Object receiveAndConvert() throws AmqpException;

Object receiveAndConvert(String queueName) throws AmqpException;

Object receiveAndConvert(long timeoutMillis) throws AmqpException;

Object receiveAndConvert(String queueName, long timeoutMillis) throws

        AmqpException;

// Получать типобезопасные объекты, преобразованные из сообщений

<T> T receiveAndConvert(ParameterizedTypeReference<T> type) throws

        AmqpException;

<T> T receiveAndConvert(String queueName, ParameterizedTypeReference<T> type)

        throws AmqpException;

<T> T receiveAndConvert(long timeoutMillis, ParameterizedTypeReference<T>

        type) throws AmqpException;

<T> T receiveAndConvert(String queueName, long timeoutMillis,

        ParameterizedTypeReference<T> type) throws AmqpException;

Эти методы являются зеркальными изображениями методов send() и convertAndSend(), описанных ранее. Принимая во внимание, что send() используется для отправки необработанных объектов Message, а receive() получает необработанные объекты Message из очереди. Аналогично, receiveAndConvert() получает сообщения и использует конвертер сообщений для преобразования их в объекты домена перед их возвратом.