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 для преобразования отправленных и полученных сообщений. .
@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, не используйте мастер, потому что мастер всегда меняется, нет гарантии, что код в статье и код на гитхабе всегда будут одинаковыми