# rabbitmq学习 **Repository Path**: jiblok/rabbitmq ## Basic Information - **Project Name**: rabbitmq学习 - **Description**: rabbitmq学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-09 - **Last Updated**: 2022-11-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 工程简介 # 延伸阅读 # 数据丢失 1.生产者弄丢了数据 产者将数据发送到rabbitmq的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能。 channel进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始), 一旦消息被投递到所有匹配的队列之后,rabbitMQ就会发送一个Ack给生产者(包含消息的唯一ID), 这就使得生产者知道消息已经正确到达目的队列了.如果rabiitMQ没能处理该消息,则会发送一个Nack消息给你,你可以进行重试操作 添加一个确认监听 channel.addConfirmListener(new ConfirmListener() { //消息失败处理 @Override public void handleNack(long deliveryTag, boolean multiple) throws IOException { //deliveryTag;唯一消息标签 //multiple:是否批量 System.err.println("-------no ack!-----------"); } //消息成功处理 @Override public void handleAck(long deliveryTag, boolean multiple) throws IOException { System.err.println("-------ack!-----------"); } }); 2.消费端弄丢了数据 启用手动确认模式可以解决这个问题(重试机制) 消费者手动确认模式 spring.rabbitmq.listener.simple.acknowledge-mode=manual 手动确认模式,如果消费者来不及处理就死掉时,没有响应ack时会重复发送一条信息给其他消费者; 如果监听程序处理异常了,且未对异常进行捕获,会一直重复接收消息,然后一直抛异常; 如果对异常进行了捕获,但是没有在finally里ack,也会一直重复发送消息(重试机制)。