SpringBoot 整合RabbitMq 自定义消息监听容器来实现消息批量处理
作者:???ddz??? 发布时间:2021-10-11 22:36:07
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文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置文件
接下来,在application.properties文件中添加以下配置:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
# 队列名称
spring.rabbitmq.listener.simple.queue-name=myQueue
# 最大并发消费者数量
spring.rabbitmq.listener.simple.concurrency=5
# 最小数量
spring.rabbitmq.listener.simple.min-concurrency=1
# 最大数量
spring.rabbitmq.listener.simple.max-concurrency=10
# 批量处理消息的大小
spring.rabbitmq.listener.simple.batch-size=50
或
spring:
rabbitmq:
host: localhost
listener:
simple:
batch-size: 50
concurrency: 5
max-concurrency: 10
min-concurrency: 1
queue-name: myQueue
password: guest
port: 5672
username: guest
virtual-host: /
编写 *
然后,我们需要创建一个 * 类,以便处理从队列中接收到的消息。以下是一个简单的示例:
@Component
public class MyListener {
@RabbitListener(queues = "myQueue", containerFactory = "myFactory")
public void handleMessage(List<MyMessage> messages, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag)
throws IOException {
try {
// 处理消息
System.out.println("Received " + messages.size() + " messages");
for (Message message : messages) {
// 处理消息
System.out.println("Received message: " + new String(message.getBody()));
}
channel.basicAck(messages.get(messages.size() - 1).getMessageProperties().getDeliveryTag(), true);
} finally {
// 手动确认消息
channel.basicAck(deliveryTag, true);
}
}
}
在上面的代码中,我们使用了@RabbitListener注解来指定要监听的队列名称,同时也指定了使用myFactory工厂来创建监听容器。在这个 * 中,我们简单地打印了接收到的消息。
创建SimpleRabbitListenerContainerFactory
接下来,我们需要创建一个SimpleRabbitListenerContainerFactory工厂,以便能够自定义监听容器的行为。以下是一个简单的示例:
@Configuration
public class RabbitMQConfig {
// @Bean
// public SimpleRabbitListenerContainerFactory myFactory(ConnectionFactory connectionFactory) {
// SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
// factory.setConnectionFactory(connectionFactory);
// factory.setConcurrentConsumers(1);
// factory.setMaxConcurrentConsumers(10);
// factory.setBatchListener(true);
// factory.setBatchSize(50);
// return factory;
// }
@Bean
public SimpleRabbitListenerContainerFactory myFactory(
ConnectionFactory connectionFactory,
PlatformTransactionManager transactionManager,
MessageConverter messageConverter) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
// 并发消费者数,默认为 1
factory.setConcurrentConsumers(5);
// 最大并发消费者数,默认为 1
factory.setMaxConcurrentConsumers(10);
// 拒绝未确认的消息并重新将它们放回队列,默认为 true
factory.setDefaultRequeueRejected(false);
// 容器启动时是否自动启动,默认为 true
factory.setAutoStartup(true);
// 消息确认模式,默认为 AUTO
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
// 每个消费者在一次请求中预获取的消息数,默认为 1
factory.setPrefetchCount(5);
// 从队列中接收消息的超时时间,默认为 0,表示没有超时限制
factory.setReceiveTimeout(1000);
// 与容器一起使用的事务管理器。默认情况下,容器不会使用事务
factory.setTransactionManager(transactionManager);
// 消息转换器,用于将接收到的消息转换为 Java 对象或将 Java 对象转换为消息
factory.setMessageConverter(messageConverter);
// 用于异步消息处理的线程池。默认情况下,容器使用一个简单的 SimpleAsyncTaskExecutor
factory.setTaskExecutor(new SimpleAsyncTaskExecutor());
// 在关闭容器时等待活动线程终止的时间,默认为 5000 毫秒
factory.setShutdownTimeout(10000);
// 重试失败的消息之前等待的时间,默认为 5000 毫秒
factory.setRecoveryInterval(5000);
// 如果消息处理器尝试监听不存在的队列,是否抛出异常。默认为 true
factory.setMissingQueuesFatal(false);
// * 容器连接工厂
factory.setConnectionFactory(connectionFactory);
return factory;
}
}
这些属性中的大多数都是可选的,可以根据需要进行设置。根据应用程序的需求,我们可以自由地调整这些属性,以提高应用程序的性能和可靠性。
发送消息
最后,我们可以编写一个简单的发送消息的代码来向队列中发送一些消息。以下是一个简单的示例:
@Component
public class MySender {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String message) {
for (int i = 0; i < 100; i++) {
rabbitTemplate.convertAndSend("myQueue", "message:" + i);
}
}
}
总之, SimpleRabbitListenerContainerFactory 提供了一个灵活而强大的机制,用于自定义和配置 RabbitMQ 消息监听容器。
来源:https://blog.csdn.net/weixin_45626288/article/details/129828326


猜你喜欢
- 要想实现android手机通过扫描名片,得到名片信息,可以使用脉可寻提供的第三方SDK,即Maketion ScanCard SDK,脉可寻
- 本文实例为大家分享了C语言自定义扫雷游戏的具体代码,供大家参考,具体内容如下实现过程对于用C语言实现扫雷游戏得实现,可将游戏过程分为两个板块
- 下载:DownLoaderTask.javapackage com.johnny.testzipanddownload;import jav
- 1.前言在Mybatis中需要创建的配置文件有sqlMapconfig.xml,映射文件xxxMapper.xml,而这些文件在idea中并
- 一、MessageBox弹出框MessageBox.Show(<字符串> Text, <字符串> Title, &l
- JDK集合源码之HashMap解析1.树结构入门1.1 什么是树?树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据
- 同一个service调用service本身如果同一个service调用service本身的方法,出现了事务不能控制。解决方案1.在sprin
- 一、Collections说明:Collcetions是集合框架中的工具,特点是方法都是静态的。二、Collections中的常见方法1,对
- 本文实例为大家分享了java根据网络地址保存图片的具体代码,供大家参考,具体内容如下import java.io.BufferedInput
- 一、实现原理 Mapper接口开发方法只需要程序员编写M
- 前言使用Redis来实现Session共享,其实网上已经有很多例子了,这是确保在集群部署中最典型的redis使用场景。在SpringBoot
- postman测试传入List<String>参数第一步:设置headersContent-type 的值为applicatio
- Java代码 InputMethodManager imm = (InputMethodManager)getSystemService(S
- 前言使用基于TCP 协议的双向通信时,网络中的两个应用程序之间必须首先建立一个连接,这两个程序通过一个双向的通信连接实现数据的交换,这个连接
- 相同:1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;2、Linke
- 本文实例讲述了C#使用doggleReport生成pdf报表的方法。分享给大家供大家参考,具体如下:1. 安装nuget-install p
- 0 实验环境在Android Studio中进行有关代码的编写和界面效果展示。SQLite数据库的图形化工具SQLiteStudio下载网址
- 一、什么是JSONJSON(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格
- 概述在JDK 1.8里,可以使用如下代码获取List元素对象中某个属性的列表。package test;import java.util.A
- Android 登录处理简单实例今天整理一下之前在项目中写的关于某些界面需要登录判断处理。这里整理了一个简易的 Demo 模拟一下 登录情况