RabbitMQ:保证消费的幂等性

方案一:设计全局唯一的ID

提供者:设置要发送的消息。

//设置全局性ID,用UUID和时间拼接。
String messageid = String.valueOf(UUID.randomUUID()).replace("-", "").trim()+CommonUtils.getSystemDate(CommonConstant.DateFormatOfymdhms);
//将ID设置到消息头中的messageID。
MessagePostProcessor mpp = new MessagePostProcessor() {
			@Override
			public Message postProcessMessage(Message message) throws AmqpException {
				 message.getMessageProperties().setMessageId(messageid);
				 return message;
			}
        };

//发送消息,携带消息体和消息头 
rabbitTemplate.convertAndSend(CommonConstant.OrderToInventoryExchage,      CommonConstant.OrderToInventoryRout,jmsg,mpp);
        	

消费者:接受消息并消费

@Autowired
private JedisCluster jedisCluster;

//判断是否消费过
String messageId = (String) headers.get(AmqpHeaders.MESSAGE_ID);
if (!inventoryReduceApi.checkRepeatConsumption(messageId)) {
//消费代码的逻辑........
//第一次消费消息,将messageID存入redis,防止重复消费
jedisCluster.set(messageId, CommonConstant.Consumed);

}




/**
	 * 检查是否重复消费
	 */
	@Override
	public Boolean checkRepeatConsumption(String messageId) {
		redisConfig.getJedisCluster().getClusterNodes();
		JedisCluster redis = redisConfig.getJedisCluster();
		return redis.exists(messageId);
	}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值