Spring Boot Series Thirteen Spring Boot интегрирует RabbitMQ

Spring Boot RabbitMQ

1 Обзор

у меня было раньшеЦикл статей о RabbitMQПредставлено использование RabbitMQ В этой статье мы расскажем, как интегрировать RabbitMQ в Spring Boot. Основное содержание этой статьи следующее:

  • Демонстрация двух способов отправки и получения сообщений в Spring boot
  • Настройте сериализацию сообщений с помощью MessageConverter

2. Знакомство с публичной частью Демо-проекта

название проекта:rabbitmq

Нужно ввести новую банку в pom.xml в нашем проекте.

 <!-- spring boot: 此版本使用的amqp-client的4.x版本,所有需要注释掉上面的amqp-client配置  -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
 </dependency>

Настройте приложение-boot.yml

spring:
  # 配置rabbitMQspring:
  rabbitmq:
    host: 10.240.80.134
    username: spring-boot
    password: spring-boot
    virtual-host: spring-boot-vhost

Следующий код находится в этом проекте

3. Простое демо-приложение

3.1. RabbitConfigure2

@Configuration
public class RabbitConfigure2 {

    // 队列名称
    public final static String SPRING_BOOT_QUEUE = "spring-boot-queue-2";
    // 交换机名称
    public final static String SPRING_BOOT_EXCHANGE = "spring-boot-exchange-2";
    // 绑定的值
    public static final String SPRING_BOOT_BIND_KEY = "spring-boot-bind-key-2";
}

3.2. Отправка сообщения

При весенней загрузке AmqpAdmin и AmqpTemplate генерируются по умолчанию, чтобы мы могли взаимодействовать с RabbitMQ. Экземпляром AmqpTemplate по умолчанию является RabbitTemplate, а экземпляром AmqpAdmin по умолчанию является RabbitAdmin.Исходный код показывает, что его внутренняя реализация на самом деле является RabbitTemplate. Таким образом, AmqpAdmin и AmqpTemplate по сути одинаковы.

код отправителя:SendMsg2

@Component
public class SendMsg2 {

    // 此接口默认实现只有一个,且是RabbitAdmin,通过源码发现其内部实现实际是RabbitTemplate。所以AmqpAdmin和AmqpTemplate当前两者本质是相同的
    @Autowired
    private AmqpAdmin amqpAdmin;

    // 此接口的默认实现是RabbitTemplate,目前只有一个实现,
    @Autowired
    private AmqpTemplate amqpTemplate;

    /**
     * 发送消息
     *
     * @param msgContent
     */
    public void send_2(String msgContent) {
        amqpTemplate.convertAndSend(RabbitConfigure2.SPRING_BOOT_EXCHANGE, RabbitConfigure2.SPRING_BOOT_BIND_KEY, msgContent);
    }
}

3.3. Получение сообщений:

Аннотируйте метод получения сообщений @RabbitListener, в котором вы можете определить

  • @QueueBinding: определите привязку сообщений, которую нужно отслеживать на этот раз.
  • @Queue: определите очередь, если RabbitMQ не имеет этой очереди, создайте ее, если она существует и параметры конфигурации совпадают, проигнорируйте ее, иначе выдайте исключение
  • @Exchange: определите обмен, если у RabbitMQ нет этого обмена, создайте его, если он существует и параметры конфигурации совпадают, проигнорируйте его, иначе выдайте исключение

Код получателя:ReceiveMsg2

@Component
public class ReceiveMsg2 {

    /**
     * === 在RabbitMQ上创建queue,exchange,binding 方法二:直接在@RabbitListener声明 begin ===
     * 接收
     * @param content
     */
    @RabbitListener(containerFactory = "rabbitListenerContainerFactory",
            bindings = @QueueBinding(
            value = @Queue(value = RabbitConfigure2.SPRING_BOOT_QUEUE+"3", durable = "true", autoDelete="true"),
            exchange = @Exchange(value = RabbitConfigure2.SPRING_BOOT_EXCHANGE, type = ExchangeTypes.TOPIC),
            key = RabbitConfigure2.SPRING_BOOT_BIND_KEY)
    )
    public void receive_2(String content) {
        // ...
        System.out.println("[ReceiveMsg-2] receive msg: " + content);
    }

}

3.4 Запуск и тестовые классы

Стартовый класс:SpringBootRabbitApplication2
Тестовый класс:SimpleTest2

@RunWith(SpringRunner.class)
@SpringBootTest(classes= SpringBootRabbitApplication2.class, value = "spring.profiles.active=boot")
public class SimpleTest2 {

    @Autowired
    private ReceiveMsg2 receiveMsg2;

    @Autowired
    private SendMsg2 sendMsg2;

    @Test
    public void sendAndReceive_2(){
        String testContent = "send msg via spring boot -2";
        sendMsg2.send_2(testContent);
        try {
            Thread.sleep(1000 * 10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

выходной результат

[ReceiveMsg-2] receive msg: send msg via spring boot -2

4. Демонстрация простого приложения 2

4.1. RabbitConfigure1

В первом примере мы объявляем очередь, переключатель и отношения привязки в аннотации @RabbitListener, здесь мы используем @Bean для объявления этого объекта. Подробнее см. в RabbitConfigure1.

@Configuration
public class RabbitConfigure1 {

    // 队列名称
    public final static String SPRING_BOOT_QUEUE = "spring-boot-queue-1";
    // 交换机名称
    public final static String SPRING_BOOT_EXCHANGE = "spring-boot-exchange-1";
    // 绑定的值
    public static final String SPRING_BOOT_BIND_KEY = "spring-boot-bind-key-1";


    // === 在RabbitMQ上创建queue,exchange,binding 方法一:通过@Bean实现 begin ===
    /**
     * 定义队列:
     * @return
     */
    @Bean
    Queue queue() {
        return new Queue(SPRING_BOOT_QUEUE, false);
    }

    /**
     * 定义交换机
     * @return
     */
    @Bean
    TopicExchange exchange() {
        return new TopicExchange(SPRING_BOOT_EXCHANGE);
    }

    /**
     * 定义绑定
     * @param queue
     * @param exchange
     * @return
     */
    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(SPRING_BOOT_BIND_KEY );
    }

4.2 Класс приема сообщений

Для получения классов по-прежнему используется @RabbitListener, но необходимо настроить только очереди.Помимо поддержки полного сопоставления, очереди также поддерживают обычное сопоставление.

Класс приема сообщений:ReceiveMsg1

@Component
public class ReceiveMsg1 {

    /**
     * 获取信息:
     *  queue也可以支持RabbitMQ中对队列的模糊匹配
     * @param content
     */
    @RabbitListener(queues = RabbitConfigure1.SPRING_BOOT_QUEUE)
    public void receive_1(String content) {
        // ...
        System.out.println("[ReceiveMsg-1] receive msg: " + content);
    }

}

4.3 Класс испытаний:

SimpleTest
выход

[ReceiveMsg-1] receive msg: send msg via spring boot - 1

5. Настройте демонстрацию MessageConverter в RabbitMQ.

В предыдущем примере, когда мы отправляем или получаем сообщения, содержимое сообщения использует String, здесь мы можем установить параметр метода отправки и получения содержимого сообщения, установив MessageConverter как объект.

5.1 Тестирование POJO

MsgContent1а такжеMsgContent2Простейший класс POJO только с приватными свойствами и методами set/get

5.2 Установите класс сериализации RabbitMsgConvertConfigure

Как и в предыдущей демонстрации, помимо использования @Bean для объявления очередей, обменов и отношений привязки, существует дополнительный метод jackson2JsonMessageConverter() для инициализации MessageConverter.Этот объект будет внедрен в контейнер RabbitListenerContainer для преобразования отправленных и полученных сообщений. .

RabbitMsgConvertConfigure

@Configuration
public class RabbitMsgConvertConfigure {
    /**
     * 定义消息转换实例
     * @return
     */
    @Bean
    MessageConverter jackson2JsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
….
}

5.3. Отправитель сообщения:

Отправить сообщение, здесь объект отправляется напрямую
отправитель сообщения:SendMsgConvertMsg

@Component
public class SendMsgConvertMsg {

    @Autowired
    private AmqpTemplate amqpTemplate;

    /**
     * 发送消息
     *
     * @param msgContent
     */
    public void sendMsgContent1(MsgContent1 msgContent) {
        amqpTemplate.convertAndSend(RabbitMsgConvertConfigure.SPRING_BOOT_EXCHANGE, RabbitMsgConvertConfigure.SPRING_BOOT_BIND_KEY, msgContent );

    }

    /**
     * 发送消息
     * @param msgContent
     */
    public void sendMsgContent2(MsgContent2 msgContent) {
        amqpTemplate.convertAndSend(RabbitMsgConvertConfigure.SPRING_BOOT_EXCHANGE, RabbitMsgConvertConfigure.SPRING_BOOT_BIND_KEY, msgContent);
    }
}

5.4. Получатель сообщения:

@RabbitListener определен в классе, чтобы указать, что этот класс является прослушивателем сообщений, и устанавливает очередь для мониторинга. параметры

Получатель сообщения:ReceiveMsgConvertMsg

@Component
// @RabbitListener除了可以作用在方法,也可以作用在类上。在后者的情况下,需要在处理的方法使用@RabbitHandler。一个类可以配置多个@RabbitHandler
@RabbitListener(queues = RabbitMsgConvertConfigure.SPRING_BOOT_QUEUE)
public class ReceiveMsgConvertMsg {

    /**
     * 获取信息:
     *  queue也可以支持RabbitMQ中对队列的模糊匹配
     * @param content
     */
    @RabbitHandler
    public void receiveMsgContent1(MsgContent1 content) {
        // ...
        System.out.println("[ReceiveMsgConvertMsg-MsgContent1] receive receiveMsgContent1 msg: " + content);
    }

    @RabbitHandler
    public void receiveMsgContent2(MsgContent2 msgContent2) {
        // ...
        System.out.println("[ReceiveMsgConvertMsg-MsgContent2] receive receiveMsgContent2 msg: " + msgContent2);
    }
}

Тестовый класс:MsgConvertTest

выходной результат

[ReceiveMsgConvertMsg-MsgContent1] receive receiveMsgContent1 msg: [ name = send msg via spring boot - msg convert - MsgContent1;  age = 27 ]
[ReceiveMsgConvertMsg-MsgContent2] receive receiveMsgContent2 msg: [ id = 83;  content = send msg via spring boot - msg convert - MsgContent1 ]

6. Код

Смотрите код github для всех подробных кодов, пожалуйста, используйте как можно большетег v0.17, не используйте мастер, потому что мастер всегда меняется, нет гарантии, что код в статье и код на гитхабе всегда будут одинаковыми