quartz详解4:quartz线程管理
http://blog.itpub.NET/11627468/viewspace-1766967/
quartz启动后有多个线程同时在跑。启动时会启动主线程、集群线程、检漏线程、工作线程。主线程负责查询到需要触发的线程,并放入到线程队列。
集群线程负责集群、检漏线程负责对未成功执行的任务进行检漏。工作线程默认是20,一般PC服务器可以调到200。
一、主线程QuartzScheduleThread
关于QuartzScheduleThread是quartz启动时开始启动,用于trigger的获取、触发,并放入到线程池中执行。
详细可以看quartz详解2:quartz由浅入深第4章
详细流程如下:
关于quartz2.0版本之后可以批量执行trigger的功能。要测试是否影响定时的准确度。
二、线程池SimpleThreadPool
线程池的初使化:new 线程并放入线程池的链表中。
执行线程:把任务放到一个线程中执行。
线程结束:修改线程状态。
线程池关闭:每个线程关闭,正在执行的线程等线程执行完了再关闭。
三、工作线程WorkThread
线程池中执行的工作线程,可以通过配置文件quartz.properties来配置大小:
JobRunShell实现runnable接口,放入到workThread下执行:
四、集群线程ClusterManager和检漏线程MisfireHandler
可以看到quartz启动时,这两个线程也启动了。
那么,它是在什么时候启动的呢?是在执行QuartzScheduler的start()方法时在JobStore类上加载的。
再来分析下,这两个线程的作用。
这两个线程都有initialize,manage,run,shutdown方法。
--1、先看ClusterManager,在new ClusterManger后,就会触发initialize方法,initialize方法再调用manager方法。
run方法的代码:
点击(此处)折叠或打开
- public void run() {
- while (!shutdown) {
- if (!shutdown) {
- long timeToSleep = getClusterCheckinInterval();
- long transpiredTime = (System.currentTimeMillis() - lastCheckin);
- timeToSleep = timeToSleep - transpiredTime;
- if (timeToSleep <= 0) {
- timeToSleep = 100L;
- }
- if(numFails > 0) {
- timeToSleep = Math.max(getDbRetryInterval(), timeToSleep);
- }
- try {
- Thread.sleep(timeToSleep);
- } catch (Exception ignore) {
- }
- }
- if (!shutdown && this.manage()) {
- signalSchedulingChangeImmediately(0L);
- }
- }//while !shutdown
- }
private long clusterCheckinInterval = 7500L; //默认7.5秒执行一次集群的manage。
而集群的manager做的事情是判断是否有节点down掉,同时每7.5秒发送同步心跳修改数据库信息。
LAST_CHECKIN_TIME每7.5秒会更新一次。
--2、再看MisfireHandler的作用:
run方法默认每15秒执行一次。如果没有misfire的话,则每60秒执行一次。
manager逻辑如下:
private long misfireThreshold = 60000L; //默认时间超过了1分钟。
就是把超过1分钟还没执行的任务,认为是misfire,然后保存到trigger表,等待重新再执行。
有状态的job如果第一次没有执行完,第二次执行的时间错过了,就会被认为是misfire
doUpdateOfMisfiredTrigger调用CronTriggerImpl的updateAfterMisfire方法。
如果misfire设置为MISFIRE_INSTRUCTION_SMART_POLICY或MISFIRE_INSTRUCTION_FIRE_ONCE_NOW就是马上执行。
如果misfire设置为MISFIRE_INSTRUCTION_DO_NOTHING则在下一个周期再执行。
默认是:MISFIRE_INSTRUCTION_SMART_POLICY
可以通过trigger的build方法增加参数实现:
withMisfireHandlingInstructionFireAndProceed().build()
withMisfireHandlingInstructionDoNothing().build()
五、总结:
从线程角度来分析集群的性能的话,主要是:
1、主线程QuartzScheduleThread的瓶颈很可能出现在数据库行锁。
--可以考虑定时任务数据保存在分布式缓存。减少对数据库的过分依赖。
2、工作线程WorkThread的瓶颈很可能出现在任务的阻塞。
--可以通过用异步任务来解析,异步任务如何放在数据库有性能问题可以再考虑分布式缓存。
quartz详解4:quartz线程管理的更多相关文章
- 转载:quartz详解:quartz由浅入深
转载网址:http://blog.itpub.net/11627468/viewspace-1763498/ 一.quartz核心概念 先来看一张图: scheduler 任务调度器 ...
- quartz详解3:quartz数据库集群-锁机制
http://blog.itpub.NET/11627468/viewspace-1764753/ 一.quartz数据库锁 其中,QRTZ_LOCKS就是Quartz集群实现同步机制的行锁表,其表结 ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)
1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...
- quartz详解2:quartz由浅入深
http://blog.itpub.net/11627468/viewspace-1763498/ 一.quartz核心概念 先来看一张图: scheduler 任务调度器 trigger 触 ...
- 【配置详解】Quartz配置文件详解
我们通常是通过quartz.properties属性配置文件(默认情况下均使用该文件)结合StdSchedulerFactory 来使用Quartz的.StdSchedulerFactory 会加载属 ...
- quartz详解1:初步了解quartz
http://blog.itpub.NET/11627468/viewspace-1763389/ 一.引入 你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后 ...
- Linux fdisk命令参数及用法详解---Linux磁盘分区管理命令fdisk
fdisk 命令 linux磁盘分区管理 用途:观察硬盘之实体使用情形与分割硬盘用. 使用方法: 一.在 console 上输入 fdisk -l /dev/sda ,观察硬盘之实体使用情形. 二.在 ...
- 零基础学习java------39---------json格式交互,Restful(不懂),静态资源映射,SSM整合(ssm整合思想,application.xml文件详解(声明式事务管理),)
一. json格式交互(知道) 1 . 回顾ajax基本语法 $.ajax({ url:"", // 请求的后台路径 data:{"":"" ...
随机推荐
- 分享一款免费的工控组态软件(PCHMI)
PCHMI严格的讲它并不是一款组态软件,也不是一款SCADA软件,而是一个基于.NET构架的DLL文件,开发者可以使用微软的Visual Studio将PCHMI.DLL加载到工具箱里面进行二次开发. ...
- chart 目录结构【转】
chart 是 Helm 的应用打包格式.chart 由一系列文件组成,这些文件描述了 Kubernetes 部署应用时所需要的资源,比如 Service.Deployment.PersistentV ...
- 实验吧——Recursive
环境:win10,kali虚拟机 工具:ida 虚拟机打开看看,发现是ELF文件,运行一下,额没有什么发现. Ida打开看看,发现是在文件内部运行python解释器,百度搜索了一个基本上可以找到Py_ ...
- Metasploit学习笔记——客户端渗透攻击
1.浏览器渗透攻击实例——MS11-050安全漏洞 示例代码如下 msf > use windows/browser/ms11_050_mshtml_cobjectelement msf exp ...
- ASP.NETCore -----导入Excel文件
前端上传excel文件利用npoi读取数据转换成datatable(netcore坑爹啊,用的vs2017竟然不能可视化) 前端界面 @{ Layout = null; } <!DOCTYPE ...
- java项目构建工具Maven
一.java-maven常用命令 mvn archetype:create 创建Maven项目 mvn compile 编译源代码 mvn deploy 发布项目 mvn test-compile 编 ...
- Window Server 2019 配置篇(3)- 建立hyper-v集群并在其上运行win10 pro虚拟机
上次讲到我们的域里有了网关跟DHCP,这次我们要在域中建立hyper-v集群并在其上运行win10 pro虚拟机 那么什么是hyper-v集群呢? 就是两个及两个以上的运行hyper-v服务的服务器建 ...
- uni-app解决小程序圆角样式不生效
在使用uni-app实现小程序的时候,设置左图的右圆角不生效,样式也都没有问题,在模拟器上也可以正常现实,手机上样式出现差别,现有以下解决方法: 设置整个圆角,然后左边使用margin-left:-3 ...
- 在 CentOS 中部署 KMS 服务器(vlmcsd)
准备 vlmcsd 下载 vlmcsd 本文使用的 vlmcsd 版本为 svn1111,支持的产品: Windows Vista – 10Windows Server 2008 - 2016Offi ...
- 01-JAVA语言基础——课程作业1—编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。
1.题目:编写一个程序,此程序从命令行接收多个数字,求和之后输出结果. 2.程序设计思想: 通过运行配置输入数字后,其保存类型为String类型,因此需要采用Integer.valueOf(arg)将 ...