方案一:设计全局唯一的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);
}