当前位置: 首页 > news >正文

建网站 赚钱如何在旅游网站上做攻略

建网站 赚钱,如何在旅游网站上做攻略,设计高端的国外网站,wordpress 添加广告插件吗背景 某项目封装了 Kafka 消费者 API,根据传递的消费者线程数,创建 N 个消费者线程同时消费对应 topic 的数据,并在线程启动后收集到全局列表中,方便在程序调用 stop 流程时逐个停止。 主控类在创建 Kafka 消费线程时使用了 Cou…

背景

某项目封装了 Kafka 消费者 API,根据传递的消费者线程数,创建 N 个消费者线程同时消费对应 topic 的数据,并在线程启动后收集到全局列表中,方便在程序调用 stop 流程时逐个停止。

主控类在创建 Kafka 消费线程时使用了 CountDownLatch ,将启动的线程收集到全局列表,并阻塞等待所有线程初始化完成;消费者线程指定 Kafka 订阅方法后对计数器减一,然后轮询消费 Kafka 的数据。

近日因某场景下不想消费某类 topic 数据而将 topic 设置为空,预想其他几类的 topic 数据应该正常消费,结果发现第一个 topic 设置为空后,其他几类消费线程都没有正常启动。

封装逻辑

程序封装了一个 KafkaConsumerThread 类,根据配置的线程数启动 N 个线程消费目标 topic 数据,基本代码如下:
在这里插入图片描述
用 CountDownLatch 控制消费者线程的初始化,本意是在 run 方法执行的时候就对计数器减一,标识本消费线程初始化完成的。

  1. 根据线程数创建 CountDownLatch 计数器。
  2. 订阅 Kafka topic。
  3. 计数器减一。
  4. 记录启动的线程对象。
  5. 主程序阻塞等待消费线程 run 方法执行到计数器减一。

问题排查

有一个 topic 设置为空后,对应的消费者线程启动报异常了:

java.lang.IllegalArgumentException: 
Topic collection to subscribe to 
cannot contain null or empty topic

一个消费异常,但其他消费者没有启动,为什么呢?理论上它们并不相干才对。

打印程序堆栈信息,发现程序阻塞了:
在这里插入图片描述

封装的 Kafka API 是顺次启动几类 topic 消费线程的,因为启动第一个 topic 消费线程时,因 topic 设置为空,consumer.subscribe(config.getTopics()) 这句代码异常了,其后面的 countDown 未执行而引发阻塞

第一个 topic 消费启动异常后,程序因调用了 countDownLatch.await() 而阻塞了,因此后面代码就不执行了,继而程序呈现异常状态。

基础巩固

CountDownLatch 是 JUC 包同步工具类,用于协调多个线程。它允许一个或多个线程等待,直到其他线程中执行的一组操作完成。CountDownLatch 通过一个计数器来实现,该计数器由线程递减,计数器值到达零后,所有调用过 await 方法的线程将解除阻塞状态。

  • 创建:new CountDownLatch 对象时,指定计数器的初始值。
  • 阻塞:一个或多个线程调用 await 方法,进入阻塞等待状态,直到计数器的值变为零。
  • 倒计数:其他线程在完成各自任务后调用 countDown 方法,将计数器的值减一。当计数器的值减到零时,所有在 await 上等待的线程会被唤醒,继续执行。

启示录

同步锁使用不当容易引发死锁问题,阿里开发者规范在 countDown() 方法处有一个提示:
在这里插入图片描述
这个提示也不准确,因为这个是一个 Kafka 消费线程,它以线程中断状态为标识,循环从 Kafka 中 poll 数据处理的,所以不能在 finally 中调用。但是也不能在 subscribe 之后调用,因为该语句会异常。

到底应该在哪里对计数器减一才能保证即使异常,也能正常减一呢?有两个方法:

  1. 简化处理,在线程的 run 方法第一行调用。
  2. 稍微复杂一点,添加一个开关,在 countDown 后面设置为 true,然后再 finally 里面判断,如果这个开关的代码没有走到,说明后面异常了,就在对计数器再补充减一:在这里插入图片描述
    其实这个问题产生的根源是没有对 topic 进行判空,如果源头控制了,就不会出现这种异常了。

PS:真心再推荐一下 utools 工具,整理本文时堆栈信息是从七天前的剪切板里面找出来的:
在这里插入图片描述
对我这种一天不知道复制粘贴多少次的人来说,这个工具真的很好用啊!

http://www.yayakq.cn/news/183779/

相关文章:

  • php商城网站开发哪个网站有学做吃的
  • 玩具公司网站建设方案单页网站怎么做
  • 电商网站竞价推广策略不会代码怎么做网站
  • 网站都是每年续费的吗怎么用模板建站
  • 澄迈住宅与建设局网站wordpress发布文章空白
  • 大连网站快速建设推荐seo 专业为网站建设
  • 个人网页设计html加js代码百度seo排名原理
  • 网站服务器多少钱一年福清手机网站建设
  • 网站被清空了怎么办淘宝网站经营与建设论文
  • 拖拽式网站建设哪家专业关于网站备案前置审批的相关说明 吉林
  • 佛山高端网站建设公司电子商务网站的整个建设流程
  • 外链网站分类辽宁鞍山网站建设公司
  • 怎样使用仿站小工具做网站尖扎网站建设公司
  • 找个做微商授权网站网站做代码图像显示不出来的
  • 为什么淘宝店主不自己做电商网站网站建设多久
  • 怎么建设网站服务器荣耀手机全部型号
  • 做产品网站费用百度搜图入口
  • 苏州建设银行官方网站婚庆网站开发工具
  • 网站开发的开发意义太原网站建
  • 一流的聊城网站建设admin.php wordpress
  • 网站原型图设计软件滁州做网站公司
  • IT科技资讯新闻类织梦网站模板网站建设与管理教案怎么写
  • 网站建设如何添加歌曲中国建筑网建设通网站
  • 网站备案 停站成都高端网站建设公司哪家好
  • 网站平台开发报价表怎么做海鲜网站模板
  • 无锡网站建设 无锡和诚科技小学文化学网站开发
  • 企业网站样板制作企业免费网站建设哪里比较好
  • php网站后台地址福建宏盛建设集团有限公司网站
  • 在招聘网站做销售怎么样合肥全员核酸检测
  • app网站开发者网站建设 实施计划书