rabbitmq 解决重复消费 保证消息的幂等性

30 篇文章 3 订阅

很简单, 我们在生产者生产消息的时候, 都要给消息加一个messageId作为消息的唯一值, 就是为了消费方避免重复消费

    @RabbitListener(queues = ORDER_SUBMIT)
    @RabbitHandler
    @Transactional
    public void orderSubmitHandler(@Payload Map<Object, Object> map, Message message, Channel channel) throws IOException {
        Object order = map.get("messageData");
        String messageId = (String) map.get("messageId");
        Object exist = redisUtils.get(messageId);
        if (null != exist) {
            // 丢弃消息至死信队列
            channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
            return;
        }
            
        // 业务代码
    }

开启手动确认消息

channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //手动确认消息
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); //拒绝消息 false 拒绝消息重新排队
    /**
     * Reject a message. Supply the deliveryTag from the {@link com.rabbitmq.client.AMQP.Basic.GetOk}
     * or {@link com.rabbitmq.client.AMQP.Basic.Deliver} method
     * containing the received message being rejected.
     * @see com.rabbitmq.client.AMQP.Basic.Reject
     * @param deliveryTag the tag from the received {@link com.rabbitmq.client.AMQP.Basic.GetOk} or {@link com.rabbitmq.client.AMQP.Basic.Deliver}
     * @param requeue true if the rejected message should be requeued rather than discarded/dead-lettered
     * @throws java.io.IOException if an error is encountered
     */
    void basicReject(long deliveryTag, boolean requeue) throws IOException;

RabbitMQ 配置死信队列

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值