java 并发优先级队列_SpringBootRabbitMQ-优先级队列

springboot技术内幕架构设计与实现

53.1元

包邮

(需用券)

去购买 >

940fafc1c5689762200b13267e0e004b.png

1460000020686132?w=800&h=410

Docker With RabbitMQ

官方 Docker 镜像仓库地址

https://hub.docker.com/_/rabb...

本地运行 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 & port

spring.rabbitmq.host=127.0.0.1

spring.rabbitmq.port=5672

Queue / Exchange / Routing 配置

/**

* RabbitMQ 配置

*/

@Configuration

public 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() {

Map args= 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/prio...

df1c644fdfe6bc7865bc07c21a96610f.png

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=true

spring.rabbitmq.template.retry.initial-interval=3000ms

spring.rabbitmq.template.retry.max-attempts=3

spring.rabbitmq.template.retry.max-interval=10000ms

spring.rabbitmq.template.retry.multiplier=1

发送消息

@Component

@AllArgsConstructor

public 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

@Component

public 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

实现类

@Slf4j

public 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

实现类

@Slf4j

public 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

@AllArgsConstructor

public class RabbitTemplateInitializingBean implements InitializingBean {

private final RabbitTemplate rabbitTemplate;

@Override

public void afterPropertiesSet() {

rabbitTemplate.setConfirmCallback(new RabbitConfirmCallBack());

rabbitTemplate.setReturnCallback(new RabbitReturnCallback());

}

}

2、RabbitMQ Exchange 类型

中文:RabbitMQ Exchange类型详解

English: RabbitMQ Tutorials

© 著作权归作者所有,转载或内容合作请联系作者

e363be9dfd7d92726572512967356a2f.gif

● Java单元测试之JUnit 5快速上手

● 高薪必备的一些Spring Boot高级面试题

● Spring Boot 2.x 中的 Actuator

● 下一代应用监控指标采集器Prometheus核心介绍

● Spring中@Async注解实现“方法”的异步调用

● 学并发编程,透彻理解这三个核心是关键

● 缓存抽象层Spring cache实战操作

● 简述设计模式原则

● 并发Bug之源有三,请睁大眼睛看清它们

● 责任链设计模式讲解

● Java Web 面试中关于Spring MVC的必问题,不收藏血亏!

● Micronaut 微服务中使用 Kafka

● 微服务网关除了zuul、spring cloud gateway还有更出色的

● RSocket——Http协议的替代者

● java中的数字以及如何判断字符串是不是数字

● 学好Spring Security 和Apache Shiro你需要具备这些条件

● Spring Security 实战干货:如何保护用户密码

本文由博客一文多发平台 OpenWrite 发布!

原文链接:https://segmentfault.com/a/1190000020686128

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

f0f3f55624fb396b1764d42d6df88864.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值