rabbitmq重试、手动签收、幂等性

以下内容基于上一篇springboot整合rabbitmq

1、重试

1.1 配置

消费者中添加如下配置

# 开启自动重试
spring.rabbitmq.listener.simple.retry.enabled=true
# 最大重试次数
spring.rabbitmq.listener.simple.retry.max-attempts=5
# 重试时间间隔
spring.rabbitmq.listener.simple.retry.initial-interval=3000

2、手动签收

2.1 配置

消费者中添加配置

# 消息确认:手动签收
spring.rabbitmq.listener.simple.acknowledge-mode=manual

2.1 消费者改造

EmailConsumer

package com.mine.consumer;

import java.io.IOException;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.rabbitmq.client.Channel;

import lombok.extern.slf4j.Slf4j;

@Component
@RabbitListener(queues = "queue_email")
@Slf4j
public class EmailConsumer {
   
	@RabbitHandler
	public void process(String content, Message message, Channel channel) throws IOException {
   
		log.info("接收到邮件队列消息:" + content);
        // 手动签收
		channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
	}
}

3、幂等性问题

使用全局MessageId判断消息是否被消费过,解决幂等性问题。也可以用唯一的业务键代替。

3.1 生产者改造

MsgProducer

package com.mine.producer;

import java.util.UUID;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.mine.config.RabbitConfig;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class MsgProducer {
   
	@Autowired
	private AmqpTemplate amqpTemplate;

	public void sendSms(String content) {
   
		// 请求头设置消息id(messageId)
		Message message = MessageBuilder.withBody(content.getBytes())
				.setContentType(MessageProperties.CONTENT_TYPE_JSON).setContentEncoding("utf-8")
				.setMessageId(UUID.randomUUID() + "").build();

		amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_DIRECT, RabbitConfig.ROUTING_KEY_SMS, message);
		log.info("sendSms success, message[" + message.getMessageProperties
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值