在Quartz框架提供了JobListener接口,可在任务执行前、任务被拒绝及任务执行完成后实现对任务的拦截,该接口的声明如下:

public interface JobListener {

    /**返回监听器名*/
String getName(); /**任务执行前对任务拦截*/
void jobToBeExecuted(JobExecutionContext context); /**任务被否决对任务拦截*/
void jobExecutionVetoed(JobExecutionContext context); /**任务执行完成对任务进行拦截*/
void jobWasExecuted(JobExecutionContext context,JobExecutionException jobException); }

下面简单实现了一个JobListener监听任务执行时间

public class SimpleJobListener implements JobListener {

    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
public String getName() {
return getClass().getSimpleName();
} /**
* 任务执行前被调用[任务执行加入任务提交时间]
* */
public void jobToBeExecuted(JobExecutionContext context) {
String job = context.getJobDetail().getJobClass().getSimpleName();
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
long start = System.currentTimeMillis();
String date = SDF.format(new Date());
jobDataMap.put("time", start);
jobDataMap.put("date", date);
System.out.println("[" + job + "]在[" + date + "]加入Quartz~~");
} @Override
public void jobExecutionVetoed(JobExecutionContext context) {
String job = context.getJobDetail().getJobClass().getSimpleName();
System.out.println("[" + job + "]在[" + SDF.format(new Date()) + "]被Quartz否决~~");
} @Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
String job = context.getJobDetail().getJobClass().getSimpleName();
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
long start = jobDataMap.getLong("time");
String date = jobDataMap.getString("date");
System.out.println("[" + job + "]在[" + date + "]添加,[" + SDF.format(new Date()) +
"]执行完成,耗时[" + (System.currentTimeMillis() - start) + "] ms");
} }

任务执行前加入JobListener

public class SchedulerDemo {

	private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	private static SchedulerFactory schedulerFactory ;

	static {
try {
Properties props = new Properties();
props.load(SchedulerDemo.class.getResourceAsStream("quartz.properties"));
schedulerFactory = new StdSchedulerFactory(props);
} catch (Exception e) {
System.out.println("[StdSchedulerFactory] init error");
}
} public static class HelloQuartzJob implements Job { @Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello Quartz! - executing its Job at [" + SDF.format(new Date()) + "] by [" + context.getTrigger().getDescription() + "]");
} } public String formatJobName(Trigger trigger , String name) {
return trigger.getClass().getSimpleName() + "_" + name + "_" + System.currentTimeMillis();
} public String formatTriggerName(Class<? extends Trigger> clazz) {
return clazz.getSimpleName() + "_" + System.currentTimeMillis();
} public void addJobListenerToJob(Scheduler scheduler, JobListener listener, Matcher<JobKey> matcher) throws Exception {
scheduler.getListenerManager().addJobListener(listener, matcher);
} /**
* JobDetail的构造通过JobBuilder构建,JobBuilder在内部调用JobDetail的实现类JobDetailImpl
* */
public void run(Trigger trigger) throws SchedulerException {
try {
Scheduler scheduler = schedulerFactory.getScheduler();
String jobName = formatJobName(trigger,"HelloQuartz");
String jobGroup = "demo";
JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJob.class)
.withIdentity(jobName, jobGroup)
.build();
/**添加监听器*/
Matcher<JobKey> matcher = KeyMatcher.keyEquals(new JobKey(jobName,jobGroup));
addJobListenerToJob(scheduler, new SimpleJobListener(), matcher);
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (Exception e) {
System.out.println("Quartz运行异常[" + e.getMessage() + "]");
} } /**
* Trigger的构造通过TriggerBuilder创建
* */
public Trigger getSimpleTrigger() {
SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity(formatTriggerName(SimpleTrigger.class), "demo")
.withDescription("SimpleTrigger")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.withRepeatCount(5))
.build();
return simpleTrigger; } public static void main(String []args) throws SchedulerException {
SchedulerDemo schedulerDemo = new SchedulerDemo();
schedulerDemo.run(schedulerDemo.getSimpleTrigger());
} }

  

Quartz任务监听器的更多相关文章

  1. quartz 添加监听器listener

    全局注册,所有Job都会起作用 JobCountListener listener = new JobCountListener(); sched.getListenerManager().addJo ...

  2. [C#][Quartz]添加监听器

    namespace Quartz.Listener { public class SchedulerListener : SchedulerListenerSupport { private stat ...

  3. Quartz使用(4) - Quartz监听器Listerner

    1. 概述 Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.Trigger ...

  4. Quartz监听器

    1.概念Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.TriggerLi ...

  5. Net作业调度(三) — Quartz.Net进阶

    介绍 前面介绍Quartz.Net的基本用法,但在实际应用中,往往有更多的特性需求,比如记录job执行的执行历史,发邮件等. 阅读目录 Quartz.Net插件 TriggerListener,Job ...

  6. Quartz简单实现定时任务管理(SSM+Quartz)

    首先你得有一个用Maven搭好的SSM框架,数据库用的Mysql,这里只有关于Quartz的部分.其实有大神总结的很好了,但做完后总有些地方不一样,所以写这篇作为笔记.这里先把大神的写的分享给大家:h ...

  7. Quartz使用记录总结

    Quartz是一个任务调度框架,最近在项目中有用到,所以做个记录总结. 一.主要元素 Scheduler:调度器,控制任务的调度,将JobDetail和Trigger注册到Scheduler加以控制. ...

  8. Spring Boot集成持久化Quartz定时任务管理和界面展示

    本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具 ...

  9. 任务调度的方式:Timer、ScheduledExecutorService、spring task、quartz、XXL-JOB、Elastic-Job

    任务调度 定时任务调度:基于给定的时间点.给定的时间间隔.给定的执行次数自动执行的任务. Timer 介绍 Timer,简单无门槛,一般也没人用. Timer位于java.util包下,其内部包含且仅 ...

随机推荐

  1. EasyUI的tree展开所有的节点或者根据特殊的条件控制展示指定的节点

    展示tree下的所有节点$(function(){ $('#t_funinfo_tree').tree({ checkbox: true, url:"<%=basePath %> ...

  2. ATL CLR MFC Win32 常规 的区别

    ATL用于编写COM程序,CLR是.NET的公共语言运行库,MFC是指MFC类库,MFC程序是用这些类库做出的程序,WIN32常规就是不用 MFC,使用API函数编的程序. MFC.ATL和CLR是V ...

  3. 《Java编程思想》笔记 第二十一章 并发

    1.定义任务 实现Runnable 接口的类就是任务类(任务类不一定是实现Runnable接口的类). 实现Runnable 接口,重写run()方法,run方法的返回值只能是 void 任务类就是表 ...

  4. CURL命令的使用

    原文地址:http://blog.sina.com.cn/s/blog_4b9eab320100slyw.html 可以看作命令行浏览器 1.开启gzip请求curl -I http://www.si ...

  5. js 之面向对象

    对象 是什么? 对象就是一个整体,对外提供一些操作,比如:电视机(不用知道内部的构造,只知道怎么用) 面向对象 是什么? 使用对象时,只关注对象提供的功能,不关心内部细节,比如:操作电视机(只知道用遥 ...

  6. 【互动问答分享】第7期决胜云计算大数据时代Spark亚太研究院公益大讲堂

    “决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第7期互动问答分享] Q1:Spark中的RDD到底是什么? RDD是Spark的核心抽象,可以把RDD看做“分布式函数编程语言”. ...

  7. [jquery] ajax parsererror

    http://stackoverflow.com/questions/5061310/jquery-returning-parsererror-for-ajax-request 方法一: 直接去掉 d ...

  8. mysql having的用法

    having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前.而 having子句在聚合后对组记录进行筛选. ...

  9. 洛谷——P1102 A-B数对

    P1102 A-B数对 题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求 ...

  10. tensorflow bilstm官方示例

    ''' A Bidirectional Recurrent Neural Network (LSTM) implementation example using TensorFlow library. ...