通过micrometer实时监控线程池的各项指标
通过micrometer实时监控线程池的各项指标前提最近的一个项目中涉及到文件上传和下载,使用到JUC的线程池ThreadPoolExecutor,在生产环境中出现了某些时刻线程池满负载运作,由于使用了CallerRunsPolicy拒绝策略,导致满负载情况下,应用接口调用无法响应,处于假死状态。考虑到之前用micrometer + prometheus + grafana搭建过监控体系,于是考虑使用micrometer做一次主动的线程池度量数据采集,最终可以相对实时地展示在grafana的面板中。 实践过程下面通过真正的实战过程做一个仿真的例子用于复盘。 代码改造首先我们要整理一下Threa ...
阅读更多
JUC同步器框架AbstractQueuedSynchronizer源码图文分析
JUC同步器框架AbstractQueuedSynchronizer源码图文分析前提Doug Lea大神在编写JUC(java.util.concurrent)包的时候引入了java.util.concurrent.locks.AbstractQueuedSynchronizer,Abstract Queued Synchronizer,也就是”基于队列实现的抽象同步器”,一般我们称之为AQS。其实Doug Lea大神编写AQS是有严谨的理论基础的,他的个人博客上有一篇论文《The java.util.concurrent Synchronizer Framework》,文章在http://i ...
阅读更多
特别教程-CronTrigger教程
特别教程-CronTrigger教程介绍cron表达式是一个已经存在了很长时间的UNIX工具,因此它的调度功能非常强大且已经经过验证。CronTrigger类的功能是基于cron的调度功能实现的。 CronTrigger使用”cron表达式”,可以创建诸如“每周一至周五上午8:00”或“每月最后一个星期五上午1:30”的触发调度时间表(调度计划)。 cron表达式很强大,但是它使用起来也有可能相当混乱(这里大概的意思是说cron的用法相对复杂,容易出错)。本教程旨在解决创建cron表达式的一些谜题,为用户提供一个资源,让他们可以在论坛或邮件列表中提问之前访问这个教程(减少在论坛或者邮件中的提问 ...
阅读更多
第十二章:其他特性
第十二章:其他特性插件Quartz提供了一个用于插入附加功能的接口org.quartz.spi.SchedulerPlugin。 你可以从org.quartz.plugins包中找到提供各种实用功能的Quartz插件。它们提供诸如在调度器启动时自动调度Job的功能,记录Job和Trigger相关事件的历史,并确保当JVM退出时调度器能够彻底关闭。 Job工厂当Trigger触发时,通过Scheduler上配置的JobFactory实例化与之关联的Job。默认的JobFactory只是在Job类上(反射)调用newInstance()。你可能需要创建自己的JobFactory实现,以完成诸如让应 ...
阅读更多
第十一章:高级(企业级)特性
第十一章:高级(企业级)特性集群Quartz集群目前与JDBC-Jobstore(JobStoreTX或JobStoreCMT)和(<–译者注:其实我觉得这里应该是”或”)TerracottaJobStore一起使用。功能包括负载均衡和Job故障转移(如果JobDetail的“请求恢复(request recovery)”标志设置为true)。 使用JobStoreTX或JobStoreCMT通过将org.quartz.jobStore.isClustered属性设置为true来启用集群模式。集群中的每个实例都应该使用相同的quartz.properties文件。这些相同的配置文件中,也 ...
阅读更多
第十章:配置、资源的使用以及SchedulerFactory
第十章:配置、资源的使用以及SchedulerFactoryQuartz的架构设计是模块化的,因此要运行它需要把几个组件组合在一起使用。幸运的是,有一些工具就是为了完成这个目标。 Quartz在能够正常运作之前,下面的几个核心组件必须配置好: ThreadPool JobStore DataSources(如果需要的话) Scheduler(调度器本身,这个是核心) 线程池提供了一组Quartz在执行Job时使用的线程。线程池中的线程越多,并发运行的Job数越多。但是,太多的线程可能会破坏你的系统。大多数Quartz的用户发现,5个左右的线程是充足的 - 因为在任何给定时间,他们的Job数 ...
阅读更多
第九章:JobStores
第九章:JobStoresJobStore负责记录你提供到调度器的所有“工作数据”:所有的Job、所有的Trigger、所有的Calendar(org.quartz.Calendar)等等。为你的Quartz调度器选择一个合适的JobStore是一个重要的步骤。幸运的是,一旦你明白不同的JobStore之间的差异,那么作出合适的选择是十分简单的。 你声明你提供给用于生成调度器实例对应的SchedulerFactory实例时候用到的属性文件(或对象)中,应该指定你的调度器应使用哪个类型的JobStore(以及它的相关配置)。注意一点: 切勿在代码中直接使用JobStore实例。由于某些原因,许多 ...
阅读更多
第八章:Scheduler监听器
第八章:Scheduler监听器SchedulerListener和TriggerListener或JobListener十分相似,它接收调度器的相关事件,调度器的相关事件不一定和特定的Trigger或者Job相关。 与Scheduler相关的事件包括:添加Job/Trigger、删除Job/Trigger、调度器中的严重错误以及关闭调度器的通知等等。 org.quartz.SchedulerListener接口: public interface SchedulerListener { public void jobScheduled(Trigger trigger); ...
阅读更多
第七章:Trigger监听器和Job监听器
第七章:Trigger监听器和Job监听器监听器(listener)是你创建的对象,主要作用是接收和处理调度器回调的事件(event)。TriggerListener接收到与触发器(Trigger)相关的事件,JobListener接收与调度任务(Job)相关的事件。 与触发器相关的事件包括:触发器正要触发,触发器错失触发,触发器触发完成(调度任务已被触发开始执行,触发器完成当次触发)。 org.quartz.TriggerListener接口: public interface TriggerListener { public String getName(); pub ...
阅读更多
第六章:CronTrigger
第六章:CronTriggerCronTrigger通常比SimpleTrigger更有用,如果你需要一个基于类似日历的概念重复出现的工作调度计划,而不是SimpleTrigger的精确指定时间间隔。使用CronTrigger,你可以指定任务触发的时间表,例如“每周五中午”或“每个工作日和上午9:30”,甚至“每周一至周五上午9:00至10点之间每5分钟”和1月份的星期五”。即使如此,和SimpleTrigger一样,CronTrigger有一个startTime,它指定何时生效,以及一个(可选的)endTime,用于指定何时停止任务调度。 Cron表达式Cron-Expressions用于配 ...
阅读更多