Spring Boot中怎么利用RabbitMQ实现优先级队列
发表于:2024-10-02 作者:千家信息网编辑
千家信息网最后更新 2024年10月02日,这篇文章给大家介绍Spring Boot中怎么利用RabbitMQ实现优先级队列,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。本地运行 RabbitMQdocker run -d
千家信息网最后更新 2024年10月02日Spring Boot中怎么利用RabbitMQ实现优先级队列
这篇文章给大家介绍Spring Boot中怎么利用RabbitMQ实现优先级队列,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
本地运行 RabbitMQ
docker run -d \--name rabbitmq \--restart always \-p 5672:5672 \-p 15672:15672 \-e RABBITMQ_DEFAULT_USER=user \-e RABBITMQ_DEFAULT_PASS=password \rabbitmq:3-management
访问可视化面板
地址:http://127.0.0.1:15672/
账号:user
密码:password
Spring Boot With RabbitMQ
Spring Boot 集成 RabbitMQ
org.springframework.boot spring-boot-starter-amqp
基本参数配置
# host & portspring.rabbitmq.host=127.0.0.1spring.rabbitmq.port=5672
Queue / Exchange / Routing 配置
/** * RabbitMQ 配置 */@Configurationpublic class RabbitMQConfig { private static final String EXCHANGE = "priority-exchange"; public static final String QUEUE = "priority-queue"; private static final String ROUTING_KEY = "priority.queue.#"; /** * 定义优先级队列 */ @Bean Queue queue() { Mapargs= new HashMap<>(); args.put("x-max-priority", 100); return new Queue(QUEUE, false, false, false, args); } /** * 定义交换器 */ @Bean TopicExchange exchange() { return new TopicExchange(EXCHANGE); } @Bean Binding binding(Queue queue, TopicExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY); }}
priority queue 定义参考官方文档:https://www.rabbitmq.com/priority.html
Spring Boot 应用启动后,会自动创建 Queue 和 Exchange ,并相互绑定,优先级队列会有如图所示标识。
RabbitMQ Publisher
Spring Boot 相关配置
# 是否开启消息发送到交换器(Exchange)后触发回调spring.rabbitmq.publisher-confirms=false# 是否开启消息发送到队列(Queue)后触发回调spring.rabbitmq.publisher-returns=false# 消息发送失败重试相关配置spring.rabbitmq.template.retry.enabled=truespring.rabbitmq.template.retry.initial-interval=3000msspring.rabbitmq.template.retry.max-attempts=3spring.rabbitmq.template.retry.max-interval=10000msspring.rabbitmq.template.retry.multiplier=1
发送消息
@Component@AllArgsConstructorpublic class FileMessageSender { private static final String EXCHANGE = "priority-exchange"; private static final String ROUTING_KEY_PREFIX = "priority.queue."; private final RabbitTemplate rabbitTemplate; /** * 发送设置有优先级的消息 * * @param priority 优先级 */ public void sendPriorityMessage(String content, Integer priority) { rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY_PREFIX + "test", content, message -> { message.getMessageProperties().setPriority(priority); return message; }); }}
RabbitMQ Consumer
Spring Boot 相关配置
# 消息接收确认,可选模式:NONE(不确认)、AUTO(自动确认)、MANUAL(手动确认)spring.rabbitmq.listener.simple.acknowledge-mode=AUTO# 最小线程数量spring.rabbitmq.listener.simple.concurrency=10# 最大线程数量spring.rabbitmq.listener.simple.max-concurrency=10# 每个消费者可能未完成的最大未确认消息数量spring.rabbitmq.listener.simple.prefetch=1
消费者执行耗时较长的话,建议
spring.rabbitmq.listener.simple.prefetch
设置为较小数值,让优先级越高的消息更快加入到消费者线程。
监听消息
@Slf4j@Componentpublic class MessageListener { /** * 处理消息 */ @RabbitListener(queues = "priority-queue") public void listen(String message) { log.info(message); }}
番外补充
1、自定义消息发送确认的回调
配置如下:
# 开启消息发送到交换器(Exchange)后触发回调spring.rabbitmq.publisher-confirms=true# 开启消息发送到队列(Queue)后触发回调spring.rabbitmq.publisher-returns=true
自定义
RabbitTemplate.ConfirmCallback
实现类
@Slf4jpublic class RabbitConfirmCallBack implements RabbitTemplate.ConfirmCallback{ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { log.info("消息唯一标识: {}", correlationData); log.info("确认状态: {}", ack); log.info("造成原因: {}", cause); }}
自定义
RabbitTemplate.ConfirmCallback
实现类
@Slf4jpublic class RabbitReturnCallback implements RabbitTemplate.ReturnCallback { @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { log.info("消息主体: {}", message); log.info("回复编码: {}", replyCode); log.info("回复内容: {}", replyText); log.info("交换器: {}", exchange); log.info("路由键: {}", routingKey); }}
配置 rabbitTemplate
@Component@AllArgsConstructorpublic class RabbitTemplateInitializingBean implements InitializingBean { private final RabbitTemplate rabbitTemplate; @Override public void afterPropertiesSet() { rabbitTemplate.setConfirmCallback(new RabbitConfirmCallBack()); rabbitTemplate.setReturnCallback(new RabbitReturnCallback()); } }
关于Spring Boot中怎么利用RabbitMQ实现优先级队列就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
消息
配置
优先级
队列
交换器
内容
数量
消费者
线程
消费
最大
更多
标识
参考
帮助
不错
最小
主体
兴趣
原因
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
完美的软件开发细节
华服互联网科技有哪些
在全国网络安全和信息工作
研招网服务器错误是怎么回事
视效公司二手服务器回收
服务器 盘符
rds数据库报警规则
类似极光服务器
运动轨迹数据库设计
本地搭建dns服务器
数据库原理中的动态文件
浪潮信息服务器国产率
软件开发给多少钱
武警网络安全十条禁令
数据库查询哪些人薪水在平均之上
成吉思汗网游都开了哪些服务器
医疗器械网络安全审查指导
小程序播放视频服务器视频
上海管理网络技术服务有哪些
怀旧服服务器的等级
计算机需要什么软件开发
网络安全系统网
警犬与高科技互联网
计算机网络技术海军士官
刷赞软件开发
信用卡逾期进入信息数据库
魔兽世界服务器人口查询tbc
手机如何查看云服务器地址
网络安全隔离是什么
drop删除数据库