妈的,我虚拟机启动后电脑跑不动了,电脑没有内存,安装了一晚上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;
}
}
连续发两条不同的消息,然后再发一条重复的消息