天天看点

Quartz任务调度(4)JobListener分版本超详细解析JobListener源码下载

相对spring的事件实现,quartz这边简化了许多,我们只需:

1. 自定义监听器接口实现类

2. 向scheduler中注册监听器实现类

只需以上两步即可我完成我们的事件监听。对于监听器实现类中,可能有些方法不是我们需要的,这时候我们只需给出空实现即可。在quartz中,监听器类型主要分为三种,和quartz三个核心类相对应:joblistener,triggerlistener,schedulerlistener。下面我们先分析joblistener的使用方法。其他两种监听器留待后面系列文章详解

我们的joblistener实现类必须实现其以下方法:

方法

说明

getname()

getname() 方法返回一个字符串用以说明 joblistener 的名称。对于注册为全局的监听器,getname() 主要用于记录日志,对于由特定 job 引用的 joblistener,注册在 jobdetail 上的监听器名称必须匹配从监听器上 getname() 方法的返回值。

jobtobeexecuted()

scheduler 在 jobdetail 将要被执行时调用这个方法。

jobexecutionvetoed()

scheduler 在 jobdetail 即将被执行,但又被 triggerlistener 否决了时调用这个方法。

jobwasexecuted()

scheduler 在 jobdetail 被执行之后调用这个方法。

这里有两种方式,一种是注册为全局监听器,对所有的jobdetail都有效,另一种是注册为针对特定jobdetail的局部监听器。针对不同的版本,有不同的配置方式

在测试中我们用到工作实现类为

在1.+版本中,我们可以通过如下代码监听job

下面是我们的完整测试代码:

现在是使用局部监听器的配置,运行程序,控制台打印:

myjoblistener触发对class tool.job.picknewsjob的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录 在11:18:31扒取新闻 在11:18:31根据文章的阅读量和评论量来生成我们的最热文章列表————————从这里我们可以看出两个工作是异步进行的 myjoblistener触发对class tool.job.picknewsjob结束执行的监听工作,这里可以进行资源销毁工作或做一些新闻扒取结果的统计工作 在11:18:33扒取新闻 在11:18:34根据文章的阅读量和评论量来生成我们的最热文章列表 我们细心观察还会发现,我们两个工作都运行了三次,但我们在配置触发器时,repeatcount都是设为2。这说明我们的任务调度特点是:主执行了1次,重复了2次,于是共执行3(1+repeatcount)次。

如果我们注释掉局部监听代码,启用全局监听,会看到控制台打印:

myjoblistener触发对class tool.job.gethottestjob的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录 在11:25:41扒取新闻 在11:25:41根据文章的阅读量和评论量来生成我们的最热文章列表 myjoblistener触发对class tool.job.gethottestjob结束执行的监听工作,这里可以进行资源销毁工作或做一些新闻扒取结果的统计工作 在11:25:43扒取新闻 在11:25:44根据文章的阅读量和评论量来生成我们的最热文章列表 即我们的两个任务都被监听了

在2.+版本中,引入了**org.quartz.listenermanager和org.quartz.matcher

**来对我们的监听器进行更细粒度的管理配置

我们通过listenermanager向scheduler中添加我们的监听器。它针对jobdetail的常用方法有:

1. public void addjoblistener(joblistener joblistener)

添加全局监听器,即所有jobdetail都会被此监听器监听

2. public void addjoblistener(joblistener joblistener, matcher matcher)

添加带条件匹配的监听器,在matcher中声明我们的匹配条件

3. public void addjoblistener(joblistener joblistener, matcher … matchers)

添加附带不定参条件陪陪的监听器

4. public boolean removejoblistener(string name)

根据名字移除joblistener

5. public list getjoblisteners()

获取所有的监听器

6. public joblistener getjoblistener(string name)

根据名字获取监听器

我们通过matcher让不同的监听器监听不同的任务。它有很多实现类,先逐一分析如下:

根据jobkey进行匹配,每个jobdetail都有一个对应的jobkey,里面存储了jobname和jobgroup来定位唯一的jobdetail。它的常用方法有:

根据组名信息匹配,它的常用方法有:

对两个匹配器取交集,实例如下:

对两个匹配器取并集,实例如下:

局部全局匹配,它有两个构造方法:

下面是我们的完整测试测序:

运行程序,我们得到下列打印信息:

根据文章的阅读量和评论量来生成我们的最热文章列表 在12:48:58扒取新闻 在12:48:59扒取新闻 显然,myjoblistener只和我们的picknewsjob匹配了。 关于测试代码的其他配置可移步参考本系列前面的文章,里面都有详细的配置实例讲解