原因

  公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架.

  虽然我自己的小玩意儿平时不需要定时任务,但是我觉得这个框架还是蛮有意思的,所以就打算来研究学习一下.记录分享一下我的学习记录.

  另外网上有的一些定时任务的时间CRON怎么配置什么的我就不介绍了...烂大街了...我就说说我的理解.

与Spring整合

  现在可能不太有不用Spring的地方了吧..Spring与quartz整合还是慢简单的...就配置2个bean就OK了.

我的项目结构是这样的..

主要就是:

1.在application-context.xml里引入quartz-context.xml这个配置.(application-context是Spring的contextLoadListener读取的配置)

2.在quartz-context.xml里配置2个bean,如图所示,第一个bean Scheduler这个调度器bean.他有些属性可以配置,比如我配置的configLocation和autoStartUp..其他属性可以自行查看这个类还有什么属性...

第二个bean是 trigger就是触发器他里面最重要的属性就是jobClass了吧...就是你的定时任务的类型.

3.自己写一个bean extends QuartzJobBean..实现他的executeInternal方法即可..

按我目前的理解就是调度器只要就是读取用户的一些配置,生成一些trigger..每个trigger可以触发自己配置的jobClass.然后我们自己写的jobClass来做具体的事情.

因为我自己做测试只有1个定时任务.所以我只有1个trigger.

还是比较清楚简单的...另外:网上有些说法是可以不用继承QuartzJobBean,用另外的jobDetail(org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean)就行即可..

基本配置与逻辑

  经过刚才的配置定时任务就能跑起来了..但是作为一个初学者,我还是有一些疑问的..

quartz.properties中可以配置哪些属性?

没错,前面SchedulerFactoryBean里引入了quartz.properties,那这个文件里就是一些quartz的配置.就像hibernate的.cfg文件一样. 那这个properties里可以写些什么呢?

首先我们来看一下SchedulerFactoryBean的类名,全名是org.springframework.scheduling.quartz.SchedulerFactoryBean.从中我们可以看出这个是Spring与quartz整合用的,他还是一个factoryBean,所以XML里配置的bean其实是调用它的getObject方法得到的对象,不管是从debug还是看类名去猜测.我们都可以很容易的发现.生成的bean应该是org.quartz.impl.StdSchedulerFactory.再看类名.org.quartz.....嗯...对了...这个就是没有整合Spring的时候quartz的自己的核心类.

然后如果大家经验比较丰富的话,可能会联想到像这种工厂类,一般都是读取一堆配置文件,然后生成了一个面板类给用户使用(是时候@hibernate的SessionFactory和session了,这也算是我自己的目前的一个总结吧.).quartz应该也是一样的道理.quartz中能配置的参数基本都写在StdSchedulerFactory类中了.

但是也不是全部,注意图中有一些.class,比如quartz默认的threadPool是SimpleThreadPool.

那你要配置他的初始线程数量的话就要设置成

 org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 15

这样...因为SimpleThreadPool有个setThreadCount方法....

如果假设我们经验不丰富,从成员域看不出来这些是可以配置的...那我们也可以从debug中看出一些端倪.

SchedulerFactoryBean是实现了InitializingBean接口的.

从图中458行我们可以看出生成的factory是StdSchedulerFactory

而459行就是初始化这个生成的StdSchedulerFactory,SchedulerFactoryBean里就配置了一些StdSchedulerFactory的默认属性

然后后面480行(我图中没有截完整)this.scheduler = createScheduler(schedulerFactory, this.schedulerName);. 通过StdSchedulerFactory得到Schedul的时候会调用StdSchedulerFactory的instantiate方法,这里会各种根据配置进行初始化.方法太长了.我就不贴出来了.从instantiate方法中我们也可以看出用到了哪些配置.

比如我配置了

 org.quartz.threadPool.threadCount: 15
org.quartz.threadPool.threadNamePrefix = haha
org.quartz.scheduler.threadName = jyz

效果就是这样:

是不是很有趣...

看了刚才的配置我又想到了一个问题:如果定时任务数量太多超过了默认的线程数量,那还会继续触发吗

这个问题其实就是和数据源差不多.如果init了5个数据库链接,现在要6个链接,是根据MaxActive增加链接还是怎么地?

从SimpleThreadPool中好像并没有看到类似的配置.......只有一个threadCount可以设置初始化的线程数量...我自己试验了一下,同一个jobClass任务1秒调用一次打印一个输出,但是在输出前先thread.sleep12秒.发现并不会新增thread,就是第11秒和第12秒什么事情都没发生...(quartz默认生成的线程数量是10)...这就有点尴尬了...不知道是要设置threadCount大一点呢...还是应该自己去实现org.quartz.spi.ThreadPool...(虽然我觉得调大点多简单..)

如果定时任务下一次触发的时候上一次还没结束,还会继续触发吗

首先看jobClass配置的是个class..所以从中我们可以看出我们的具体的Job类的对象应该是用反射生成的,那每次生成的应该是不同的实例,那就算前一次没执行完也不会影响下一次的执行.

如果前面使用MethodInvokingJobDetailFactoryBean的话里面有个concurrent属性可以设置是否并发,默认是true.

如果像我这样配置的话可以自己去加锁.这是我目前的解决办法.但是如果我自己加锁的话那线程还是被占用的..所以如果定时任务多了就很尴尬了..(虽然好像一般不会有这种情况)

怎么注入Spring的bean

因为前面job类应该是反射生成的,不归Spring管理,所以注入Spring的对象是不太可能的.但是triggerFactoryBean和schedulerFactoryBean是我们配置的Spring的bean他们里面有一些context属性(map类型)可以配置,而我们写的具体的job的executeInternal(JobExecutionContext context)中应该可以通过context来获取这些信息.网上有介绍的方法,不过我没有细看.

我觉得最简单的就是直接写一个工具类,继承Spring的ApplicationContextAware.然后就可以用这个工具类得到applicationContext从而得到你要的service或者其他什么bean了..比前面XML配置似乎要简单一点.

以上就是我初学quartz的感想

Quartz 学习记录1的更多相关文章

  1. Quartz学习记录

    参考资料: 官方网站 Quartz使用总结

  2. Quartz学习-- quartz基本介绍和 Cron表达式

    Quartz学习 一. Quartz 大致简介 Quartz 是完全由 java 开发的一个开源的任务日程管理系统 ​任务日程管理系统 换句话说就是: ​ 一个预先确定的日程时间到达时,负责执行任务的 ...

  3. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

  4. Elasticsearch、XXLJob以及最近的学习记录

    Elasticsearch.XXLJob以及最近的学习记录 前言 在这九月的最后一周,来总结一下最近的学习记录,主要是对于Elasticsearch.XXLjob的初步学习,想着还是多记录点,以便后面 ...

  5. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  6. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  7. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  8. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  9. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

随机推荐

  1. HTML之DocType的几种类型 -转载

    HTML之DocType的几种类型转载 doctype类型详细doctype的几种类型html之doctype 分类: 前端文摘  在默认情况下,FF和IE的解释标准是不一样的,也就是说,如果一个网页 ...

  2. JQuery 了解

    jQuery是什么?为什么是这样?怎么用? jQuery是对JavaScript的一种封装,是一个常用功能库.javascript是做什么的jquery就是做啥的.用它主要使写js更简便而强大,有些功 ...

  3. ASP.NET MVC 5 04 - 控制器

    PS: 唉.本来这一篇前几天早就应该发了的,可是谁每月没有那么几天啊... 呵呵.开个玩笑.反正就是各种烦气,所以也就一直没上来继续发了. 年底了,摆正一下心态吧.好好干,整点钱,过年回家能跟亲朋好友 ...

  4. Java多线程中的死锁问题

    Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能 ...

  5. [原创]最近使用React-Native的适配问题和警告搜集

    主要记录一下最近使用RN 0.29.2版本遇到的适配的坑以及部分警告的解法. 适配类: 安卓输入框圆角.边框颜色.粗细等无法设置成功,需要在TextInput外面新增一个View设置圆角,TextIn ...

  6. 在IT择善培训机构的培训心得

    人的一生中都是不断学习来提高 自己,俗话说:“知识是人类不断进步的阶梯”也是“飞向天空的翅膀”.       本人因工作的加入了择善进行学习,能成为择善的学员,不知不觉来到择善1个多月,回想起这1个多 ...

  7. 使用jenkins配置.net mvc网站进行持续集成三

    前两篇讲解了Jenkins的配置和VS远程发布,现在还有一个问题,VS项目远程发布的时候,配置的是覆盖所有文件重生成的,而通常类似于配置文件这种东西,在本地开发环境和测试环境是不一样的.所以我们通常需 ...

  8. common-pool2 学习:thrift连接池的另一种实现

    对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造轮子,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...

  9. [LeetCode] Find All Duplicates in an Array 找出数组中所有重复项

    Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others ...

  10. [LeetCode] Sentence Screen Fitting 调整屏幕上的句子

    Given a rows x cols screen and a sentence represented by a list of words, find how many times the gi ...