测试重复消费

 

妈的,我虚拟机启动后电脑跑不动了,电脑没有内存,安装了一晚上windows版本的小兔子

生产者

/**
 * @Author: 菠萝哥
 */
@SpringBootTest
public class ProducerTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    void testProducer() throws Exception {
        // 在发送消息的时候 携带一个唯一标记
        rabbitTemplate.convertAndSend("test.repeat.queue", "测试重复消费消息", message -> {
            // 创建一个唯一标记
            String msgId = UUID.randomUUID().toString();
            System.out.println(msgId);
           // message.getMessageProperties().setMessageId(msgId);
            message.getMessageProperties().setMessageId("189002a6-e513-4baf-a162-495b7ce11640");
            return message;
        });
        System.in.read();
    }

}

消费者


/**
 * @Author: 菠萝哥
 */
@Component
public class RepeatMsgListener {

    @Autowired
    private RepeatFilter repeatFilter;

    @RabbitListener(queues = "test.repeat.queue")
    public void handleRepeatMsg(Channel channel, Message message) {
        // 1.拿到消息的id
        MessageProperties messageProperties = message.getMessageProperties();
        String messageId = messageProperties.getMessageId();
        // 拿到投递的标记
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        // 拿到消息
        String msg = new String(message.getBody());
        // 2.判断是否存在
        if (repeatFilter.exist(messageId)) {
            // 认为这个消息是重复的消息
            // 考虑一些hash碰撞的问题 如果判断一个消息是否存在 这个时候可能会有误判
            System.out.println(msg);
            // 签收
            try {
                channel.basicAck(deliveryTag, false);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }
        // 消息没有来过 处理业务逻辑
        // dosth
        System.out.println("处理业务");
        // 添加到过滤器中去
        repeatFilter.add(messageId);
        // 签收
        try {
            channel.basicAck(deliveryTag, false);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }

}

连续发两条不同的消息,然后再发一条重复的消息

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猴子的救兵啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值