SpringBoot怎么整合RabbitMq自定义消息监听容器来实现消息批量处理

其他教程   发布日期:2024年11月20日   浏览次数:281

这篇文章主要介绍“SpringBoot怎么整合RabbitMq自定义消息监听容器来实现消息批量处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么整合RabbitMq自定义消息监听容器来实现消息批量处理”文章能帮助大家解决问题。

SpringBoot 整合RabbitMq 自定义消息监听容器来实现消息批量处理

前言

RabbitMQ是一种常用的消息队列,Spring Boot对其进行了深度的整合,可以快速地实现消息的发送和接收。在RabbitMQ中,消息的发送和接收都是异步的,因此需要使用监听器来监听消息的到来。Spring Boot中提供了默认的监听器容器,但是有时候我们需要自定义监听器容器,来满足一些特殊的需求,比如批量获取数据。

在本文中,我们将使用Spring Boot来整合RabbitMQ,并自定义一个监听器容器,实现批量获取数据的功能。
前置条件:
在开始之前,您需要具备以下条件:

  • 已经安装好RabbitMQ服务器并启动。

  • 已经创建好要使用的队列。

  • 已经熟悉了Spring Boot和RabbitMQ的基本知识。

环境准备:
在开始之前,我们需要准备好以下环境:

  • JDK 1.8或以上版本

  • Spring Boot 2.5.0或以上版本

  • RabbitMQ 3.8.0或以上版本

添加依赖

首先,在pom.xml文件中添加以下依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-amqp</artifactId>
  4. </dependency>

配置文件

接下来,在application.properties文件中添加以下配置:

  1. spring.rabbitmq.host=localhost
  2. spring.rabbitmq.port=5672
  3. spring.rabbitmq.username=guest
  4. spring.rabbitmq.password=guest
  5. spring.rabbitmq.virtual-host=/
  6. # 队列名称
  7. spring.rabbitmq.listener.simple.queue-name=myQueue
  8. # 最大并发消费者数量
  9. spring.rabbitmq.listener.simple.concurrency=5
  10. # 最小数量
  11. spring.rabbitmq.listener.simple.min-concurrency=1
  12. # 最大数量
  13. spring.rabbitmq.listener.simple.max-concurrency=10
  14. # 批量处理消息的大小
  15. spring.rabbitmq.listener.simple.batch-size=50

  1. spring:
  2. rabbitmq:
  3. host: localhost
  4. listener:
  5. simple:
  6. batch-size: 50
  7. concurrency: 5
  8. max-concurrency: 10
  9. min-concurrency: 1
  10. queue-name: myQueue
  11. password: guest
  12. port: 5672
  13. username: guest
  14. virtual-host: /

编写监听器

然后,我们需要创建一个监听器类,以便处理从队列中接收到的消息。以下是一个简单的示例:

  1. @Component
  2. public class MyListener {
  3. @RabbitListener(queues = "myQueue", containerFactory = "myFactory")
  4. public void handleMessage(List<MyMessage> messages, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag)
  5. throws IOException {
  6. try {
  7. // 处理消息
  8. System.out.println("Received " + messages.size() + " messages");
  9. for (Message message : messages) {
  10. // 处理消息
  11. System.out.println("Received message: " + new String(message.getBody()));
  12. }
  13. channel.basicAck(messages.get(messages.size() - 1).getMessageProperties().getDeliveryTag(), true);
  14. } finally {
  15. // 手动确认消息
  16. channel.basicAck(deliveryTag, true);
  17. }
  18. }
  19. }

在上面的代码中,我们使用了@RabbitListener注解来指定要监听的队列名称,同时也指定了使用myFactory工厂来创建监听容器。在这个监听器中,我们简单地打印了接收到的消息。

创建SimpleRabbitListenerContainerFactory

接下来,我们需要创建一个SimpleRabbitListenerContainerFactory工厂,以便能够自定义监听容器的行为。以下是一个简单的示例:

  1. @Configuration
  2. public class RabbitMQConfig {
  3. // @Bean
  4. // public SimpleRabbitListenerContainerFactory myFactory(ConnectionFactory connectionFactory) {
  5. // SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
  6. // factory.setConnectionFactory(connectionFactory);
  7. // factory.setConcurrentConsumers(1);
  8. // factory.setMaxConcurrentConsumers(10);
  9. // factory.setBatchListener(true);
  10. // factory.setBatchSize(50);
  11. // return factory;
  12. // }
  13. @Bean
  14. public SimpleRabbitListenerContainerFactory myFactory(
  15. ConnectionFactory connectionFactory,
  16. PlatformTransactionManager transactionManager,
  17. MessageConverter messageConverter) {
  18. SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
  19. // 并发消费者数,默认为 1
  20. factory.setConcurrentConsumers(5);
  21. // 最大并发消费者数,默认为 1
  22. factory.setMaxConcurrentConsumers(10);
  23. // 拒绝未确认的消息并重新将它们放回队列,默认为 true
  24. factory.setDefaultRequeueRejected(false);
  25. // 容器启动时是否自动启动,默认为 true
  26. factory.setAutoStartup(true);
  27. // 消息确认模式,默认为 AUTO
  28. factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
  29. // 每个消费者在一次请求中预获取的消息数,默认为 1
  30. factory.setPrefetchCount(5);
  31. // 从队列中接收消息的超时时间,默认为 0,表示没有超时限制
  32. factory.setReceiveTimeout(1000);
  33. // 与容器一起使用的事务管理器。默认情况下,容器不会使用事务
  34. factory.setTransactionManager(transactionManager);
  35. // 消息转换器,用于将接收到的消息转换为 Java 对象或将 Java 对象转换为消息
  36. factory.setMessageConverter(messageConverter);
  37. // 用于异步消息处理的线程池。默认情况下,容器使用一个简单的 SimpleAsyncTaskExecutor
  38. factory.setTaskExecutor(new SimpleAsyncTaskExecutor());
  39. // 在关闭容器时等待活动线程终止的时间,默认为 5000 毫秒
  40. factory.setShutdownTimeout(10000);
  41. // 重试失败的消息之前等待的时间,默认为 5000 毫秒
  42. factory.setRecoveryInterval(5000);
  43. // 如果消息处理器尝试监听不存在的队列,是否抛出异常。默认为 true
  44. factory.setMissingQueuesFatal(false);
  45. // 监听器容器连接工厂
  46. factory.setConnectionFactory(connectionFactory);
  47. return factory;
  48. }
  49. }

这些属性中的大多数都是可选的,可以根据需要进行设置。根据应用程序的需求,我们可以自由地调整这些属性,以提高应用程序的性能和可靠性。

发送消息

最后,我们可以编写一个简单的发送消息的代码来向队列中发送一些消息。以下是一个简单的示例:

  1. @Component
  2. public class MySender {
  3. @Autowired
  4. private RabbitTemplate rabbitTemplate;
  5. public void sendMessage(String message) {
  6. for (int i = 0; i < 100; i++) {
  7. rabbitTemplate.convertAndSend("myQueue", "message:" + i);
  8. }
  9. }
  10. }

以上就是SpringBoot怎么整合RabbitMq自定义消息监听容器来实现消息批量处理的详细内容,更多关于SpringBoot怎么整合RabbitMq自定义消息监听容器来实现消息批量处理的资料请关注九品源码其它相关文章!