消息中间件系列教程(15) -RabbitMQ-基于全局消息ID解决幂等性问题

使用RabbitMQ的时候,同一个消息可能会被消费者多次消费,那么该如何解决呢?

可以使用全局MessageID,解决幂等性的问题。

基于《消息中间件系列教程(13) -RabbitMQ-SpringBoot集成RabbitMQ》的环境,下面直接上代码进行讲解:

1.生产者,定义一个全局MessageID:

@Component
public class FanoutProducer {
    @Autowired
    private AmqpTemplate amqpTemplate;

    /*public void send(String queueName) {
        String msg = "my_fanout_msg:" + new Date();
        System.out.println(msg + ":" + msg);
        amqpTemplate.convertAndSend(queueName, msg);
    }*/

    public void send(String queueName) {
        String msg = "my_fanout_msg:" + System.currentTimeMillis();
        Message message = MessageBuilder.withBody(msg.getBytes()).setContentType(MessageProperties.CONTENT_TYPE_JSON)
                .setContentEncoding("utf-8").setMessageId(UUID.randomUUID() + "").build();
        System.out.println(msg + ":" + msg);
        amqpTemplate.convertAndSend(queueName, message);
    }
}

2.消费者:

@Component
public class FanoutSmsConsumer {

    @RabbitListener(queues = "fanout_sms_queue")
    public void process(Message message) throws Exception {
        String messageId = message.getMessageProperties().getMessageId();
        System.out
                .println(Thread.currentThread().getName() + ",邮件消费者获取生产者消息msg:" + new String(message.getBody(), "UTF-8")
                        + ",messageId:" + messageId);
        /*if(hasFinished(messageId)){
            //如果消息处理完了,则直接完成,不消费信息
            return;
        }*/
    }
}

在生产者控制台和消费者控制台,打印:
消息中间件系列教程(15) -RabbitMQ-基于全局消息ID解决幂等性问题
消息中间件系列教程(15) -RabbitMQ-基于全局消息ID解决幂等性问题

本文代码已上传至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringBoot-RabbitMQ-Demo.git

上一篇:DM8 MPP(不带主备)集群的搭建


下一篇:基于laravel+workerman+easywechat的公众号客服系统