赞
踩
@PostConstruct注解是Java EE规范中的一部分,主要用于标记在一个Bean初始化完成后需要执行的方法。这个注解由JSR-250定义,并且在Spring框架以及其他遵循Java EE标准的应用服务器中广泛支持。
功能与用途:初始化方法,当容器完成对Bean的实例化并且所有依赖注入完成后,将会自动调用标有@PostConstruct
注解的方法。这为开发者提供了一个机会,在对象正式投入使用之前进行一些必要的初始化工作,比如初始化资源、预计算某些值、启动后台任务等增强。
作用: Publisher Confirm机制允许RabbitMQ服务器通知生产者一个消息是否已经被交换机正确接收。当publisher-confirm-type设置为CORRELATED时,RabbitMQ会向生产者发送确认或否定响应,确认消息已到达交换机,但不保证消息已被路由到至少一个队列中。
生产者到交换机的确认(消息到达交换机)
spring.rabbitmq.publisher-confirm-type = CORRELATED
只要到达交换机就会触发
- rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
- @Override
- public void confirm(CorrelationData correlationData, boolean ack, String cause) {
- if (ack) {
- // 消息成功投递成功并被确认
- } else {
- // 消息未能正确投递
- }
- }
- });
作用: Publisher Return机制用于当消息无法按照路由键规则路由到任何队列时,或者由于其他原因(例如队列满、消息过大等)而被交换机拒绝时,RabbitMQ将消息返回给生产者。
交换机到队列的确认(消息是否正常发送到了队列)
通过实现 ReturnCallback 接口,发送消息失败返回,比如交换机路由不到队列时触发回调:
1.只有消息没有路由到队列的时候,才触发该回调 .
2.只要有一个队列接受到消息了,它就认为成功.
spring.rabbitmq.publisher-returns = true
- rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
- @Override
- public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
- // 处理未被路由或因某种原因被退回的消息
- }
- });
-
-
- @Slf4j
- @Service
- public class DirectProvider implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {
- @Autowired
- private RabbitTemplate rabbitTemplate;
-
- //注解是专门数据初始化的注解, 只有其他组件注入后,初始化方法才会执行,
- @PostConstruct
- public void init() {
- rabbitTemplate.setConfirmCallback(this);
- rabbitTemplate.setReturnCallback(this);
- }
-
- public void send(OrderingOk orderingOk){
-
- CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
- System.out.println("callbackSender UUID: " + correlationData.getId());
- rabbitTemplate.convertAndSend(
- "Direct_E01",
- "test",orderingOk,
- m-> m,correlationData);
- }
-
- /**
- * 确认消息是否被交换机接收。
- *
- * @param correlationData 包含消息相关数据的对象,用于识别消息的唯一性。
- * @param ack 表示消息是否被交换机确认接收。
- * @param cause 如果消息未被接收,提供未接收的原因。
- */
- @Override
- public void confirm(CorrelationData correlationData, boolean ack, String cause) {
- // 获取相关数据的ID,如果相关数据为空,则设置为空字符串
- String id = correlationData != null ? correlationData.getId() : "";
- // 如果消息被确认接收,则记录日志
- if (ack) {
- log.info("交换机已经收到了ID为:{}的消息", id);
- } else {
- // 如果消息未被确认接收,则记录包括未接收原因的日志
- log.info("交换机还未收到ID为:{}的消息,由于原因:{}", id, cause);
- }
-
- }
-
- /**
- * 记录被交换机退回的消息信息。
- *
- * @param message 消息对象,包含消息体。
- * @param replyCode 返回的响应代码,用于指示退回的原因。
- * @param replyText 返回的响应文本,提供关于退回的详细信息。
- * @param exchange 退回时涉及的交换机名称。
- * @param routingKey 退回时使用的路由键。
- */
- public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
- // 记录消息退回的日志信息
- log.info("消息{},被交换机:{}退回,原因是:{},路由key是:{}", new String(message.getBody()), exchange, replyCode, replyText, routingKey);
- }
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。