rabbitMq消费死循环
- 消费过程发生错误容易造成死循环
- 1.控制重发次数
- 2.try+catch+手动ack
- 3.try+catch+手动ack+死信队列(重试次数就失效了,因为捕捉确认后被打入了相应的死信队列)
void basicAck(long deliveryTag, boolean multiple) throws IOException;
第一个参数deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTag,(任何channel上发布的第一条消息的deliveryTag为1,此后的每一条消息都会加1),deliveryTag在channel范围内是唯一的
第二个参数multiple:批量确认标志。如果值为true,则执行批量确认,此deliveryTag之前收到的消息全部进行确认; 如果值为false,则只对当前收到的消息进行确认
void basicReject(long deliveryTag, boolean requeue) throws IOException;
第一个参数deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTag,deliveryTag在channel范围内是唯一的
第二个参数requeue:表示如何处理这条消息,如果值为true,则重新放入RabbitMQ的发送队列,如果值为false,则通知RabbitMQ销毁这条消息
channel.basicNack是 channel.basicReject的补充,提供一次对多条消息进行拒绝的功能
void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;
第一个参数deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTag,deliveryTag在channel范围内是唯一的
第二个参数multiple:批量确认标志。如果值为true,包含本条消息在内的、所有比该消息deliveryTag值小的 消息都被拒绝了(除了已经被 ack 的以外);如果值为false,只拒绝三本条消息
第三个参数requeue:表示如何处理这条消息,如果值为true,则重新放入RabbitMQ的发送队列,如果值为false,则通知RabbitMQ销毁这条消息
// 每个客户端每次最后获取N个消息
channel.basicQos(1);
* (Wmxg)表控制层
*
* @author makejava
* @since 2021-03-27 23:02:34 结合producetransation 看文档的图片理解
*/
@Component
public class OrderMqConsumer {
/**
* 服务对象
*/
private int count=1;
@Autowired
private DispatcherService dispatcherService;
@RabbitHandler
// @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "order.fanout.exchange",
// durable = "true",autoDelete = "false"),
// exchange = @Exchange(value = "order_fanout_exchange",type = ExchangeTypes.FANOUT)))
@RabbitListener(queues ="order.fanout.exchange")
public void messageconsumer(String mesg, Channel channel, CorrelationData correlationData, @Header(AmqpHeaders.DELIVERY_TAG)long tag) throws IOException {
try {
//1收到消息是
System.out.println("收到的消息是:" + mesg + ",count=" + count);
//2获取订单的信息
Kung kung = JSON.parseObject(mesg, Kung.class);
//3获取ID
String orderId = kung.getOrderId();
String userId = kung.getUserId();
//4保存运单
Wmxg wmxg = new Wmxg();
wmxg.setOrderId(orderId);
wmxg.setUserId(userId);
- //幂等性的问题,存在则更新,不存在则插入 使用分布式锁也可以解决
避免重试时重复派单
true对消息进行批量确认
dispatcherService.insert(wmxg);
System.out.println(1 / 0);
//对当前消息进行应答
//用catch进行捕捉
channel.basicAck(tag,false); //只对当前收到的消息进行确认
} catch (Exception e) {
//如果出现异常的情况,根据实际情况去进行重发
//重发一次后,丢失还是日记,库存根据自己的业务场景去定
//参数1:消息的tag
// 参数2:false 多条处理
// 参数3:requeue重发 fasle 不会重发,会把消息打入死信队列(自己建立一个死信队列,如下文书所示) true会进入死循环的重发(造成重复消费),建议true的情况下,不使用try catch 否则造成循环
channel.basicNack(tag,false,false);
}
}
自己建立的死信队列:
- @Bean
public Queue orderQueue() {
Map<String,Object> args=new HashMap<>();
args.put("x-message-ttl",5000);//这里过期时间一定是一个INT类型
args.put("x-dead-letter-exchange","dead_direct_exchange");//绑定死信队列交换机
args.put("x-max-length",5);//指定最大接受多少条
args.put("x-dead-letter-routing-key","dead");//fanout没有key
return new Queue("order.fanout.exchange", true,false,false,args);
}
rabbitMq消费死循环的更多相关文章
- C#多线程技术提高RabbitMQ消费吞吐率
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第二部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
- 提升RabbitMQ消费速度的一些实践
RabbitMQ是一个开源的消息中间件,自带管理界面友好.开发语言支持广泛.没有对其它中间件的依赖,而且社区非常活跃,特别适合中小型企业拿来就用.这篇文章主要探讨提升RabbitMQ消费速度的一些方法 ...
- 由一个RABBITMQ监听器死循环引出的SPRING中BEAN和MAPPER接口的注入问题
1 @Slf4j 2 @RestController 3 @Component 4 public class VouchersReceiverController implements Message ...
- RabbitMQ 消费消息
1, 创建一个 springboot 项目, 导入依赖(和生产者一致) 2, application.properties (基础配置和生产者一致, 消费者需要再额外配置一些) # rabbitmq ...
- rabbitmq消费端加入精确控频。
控制频率之前用的是线程池的数量来控制,很难控制.因为做一键事情,做一万次,并不是每次消耗的时间都相同,所以很难推测出到底多少线程并发才刚好不超过指定的频率. 现在在框架中加入控频功能,即使开200线程 ...
- rabbitmq 生产者 消费者(多个线程消费同一个队列里面的任务。) 一个通用rabbitmq消费确认,快速并发运行的框架。
rabbitmq作为消息队列可以有消息消费确认机制,之前写个基于redis的通用生产者 消费者 并发框架,redis的list结构可以简单充当消息队列,但不具备消费确认机制,随意关停程序,会丢失一部分 ...
- RabbitMQ消费方式汇总
在学习本章节前,请先学习之前的章节:Java访问RabbitMQ:https://www.cnblogs.com/duanjt/p/10057330.htmlRabbitMQ消息发布时的权衡:http ...
- RabbitMQ消费端消息的获取方式(.Net Core)
1[短链接]:BasicGet(String queue, Boolean autoAck) 通过request的方式独自去获取消息,断开式,一次次获取,如果返回null,则说明队列中没有消息. 隐患 ...
- Rabbitmq消费失败死信队列
Rabbitmq 重消费处理 一 处理流程图: 业务交换机:正常接收发送者,发送过来的消息,交换机类型topic AE交换机: 当业务交换机无法根据指定的routingkey去路由到队列的时候,会全部 ...
随机推荐
- 2019版pycharm永久激活
链接:https://pan.baidu.com/s/1vY1KBvi2NHIgoN8C2qaFbg 提取码:p4gx 1.下对应版本的jar包,放到pycharm目录的bin目录下2.去C:\Use ...
- tomcat与springmvc 结合 之---第18篇 StandContext容器和SpringMVC的监听器的模型
writedby张艳涛 如何使用tomcat的监听器 public class BootStrap_ex06 { public static void main(String[] args) { Ht ...
- js学习笔记之公告逐行显示
$(function(){ var newsListHeight = $(".news-list").height(); //获得内容的高度 var newsConHeight = ...
- solr(CVE-2019-17558)远程命令执行
影响版本 Apache Solr 5.x到8.2.0版本 测试 https://github.com/jas502n/CVE-2019-0193
- 论文笔记:(CVPR2017)PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
目录 一. 存在的问题 二. 解决的方案 1.点云特征 2.解决方法 三. 网络结构 四. 理论证明 五.实验效果 1.应用 (1)分类: ModelNet40数据集 (2)部件分割:ShapeNet ...
- 用QT写的简单Todo记事本-附源码(浮动窗口)
去年边学边写了搞了很久, 已经好久没继续开发了, 先放出来供大家参考吧. 发现自己的学习能力还是不错的. 技术点: 使用QT, QML技术 代码参考: https://github.com/cnscu ...
- 大都市meg DFS序
题目描述 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄, ...
- 洛谷P3052题解
题面 看起来非常简单,但是细节多的一批的状压DP入门题. 我设 \(f_i\) 为 \(i\) 状态时最小分组数, \(g_i\) 为 \(i\) 状态时最后一组剩余空间. 对于每一个 \(i\) , ...
- DVWA靶场练习-Command Injection命令注入
Command Injection 原理 攻击者通过构造恶意参数,破坏命令的语句结构,从而达到执行恶意命令的目的.
- 大学同学做Java开发比我多5K,八年老Android只会crud该转Java吗?
最近在网上看到这样一个帖子: 做了八年Android开发,感觉这块做着也挺没意思,日常工作就是做一些架构优化,质量数据监控,改一改构建脚本,最主要的是业务负责人没有一个是做客户端的,都是后端的人. 最 ...