Quartz任务监听器
在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任务监听器的更多相关文章
- quartz 添加监听器listener
		全局注册,所有Job都会起作用 JobCountListener listener = new JobCountListener(); sched.getListenerManager().addJo ... 
- [C#][Quartz]添加监听器
		namespace Quartz.Listener { public class SchedulerListener : SchedulerListenerSupport { private stat ... 
- Quartz使用(4) - Quartz监听器Listerner
		1. 概述 Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.Trigger ... 
- Quartz监听器
		1.概念Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.TriggerLi ... 
- Net作业调度(三) — Quartz.Net进阶
		介绍 前面介绍Quartz.Net的基本用法,但在实际应用中,往往有更多的特性需求,比如记录job执行的执行历史,发邮件等. 阅读目录 Quartz.Net插件 TriggerListener,Job ... 
- Quartz简单实现定时任务管理(SSM+Quartz)
		首先你得有一个用Maven搭好的SSM框架,数据库用的Mysql,这里只有关于Quartz的部分.其实有大神总结的很好了,但做完后总有些地方不一样,所以写这篇作为笔记.这里先把大神的写的分享给大家:h ... 
- Quartz使用记录总结
		Quartz是一个任务调度框架,最近在项目中有用到,所以做个记录总结. 一.主要元素 Scheduler:调度器,控制任务的调度,将JobDetail和Trigger注册到Scheduler加以控制. ... 
- Spring Boot集成持久化Quartz定时任务管理和界面展示
		本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具 ... 
- 任务调度的方式:Timer、ScheduledExecutorService、spring task、quartz、XXL-JOB、Elastic-Job
		任务调度 定时任务调度:基于给定的时间点.给定的时间间隔.给定的执行次数自动执行的任务. Timer 介绍 Timer,简单无门槛,一般也没人用. Timer位于java.util包下,其内部包含且仅 ... 
随机推荐
- 【 Linux 】I/O工作模型及Web服务器原理
			一.进程.线程 进程是具有一定独立功能的,在计算机中已经运行的程序的实体.在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6) ... 
- python中的enumerate使用
			enumerate函数用于遍历序列中的元素以及它们的下标,多用于在for循环中得到计数,enumerate参数为可遍历的变量,如 字符串,列表等 一般情况下对一个列表或数组既要遍历索引又要遍历元素时, ... 
- hdu 1422(贪心)
			重温世界杯 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ... 
- MAC使用homeBrew安装Redis
			homeBrew的操作命令如下: brew search ** //查找某个软件包 brew list //列出已经安装的软件的包 brew install ** //安装某个软件包,默认安装的是稳定 ... 
- Python 进阶 之 协程
			协程的概念级描述(与线程对比):转自知乎 链接 线程有两个必须要处理的问题:一是碰着阻塞式I\O会导致整个进程被挂起: 二是由于缺乏时钟阻塞,进程需要自己拥有调度线程的能力. 如果一种实现使得每个线程 ... 
- windows下tortoiseGit安装和使用
			一.安装git for windows 首先下载git for windows客户端http://msysgit.github.io/ 安装过程没什么特别的,不停next就ok了 图太多就不继 ... 
- firefox中outlook.com页面卡顿的原因
			在火狐中使用outlook.com时,鼠标点击动作后,页面会卡顿一段时间,每次点击都是如此. 因为之前火狐出现由于硬件加速导致页面卡顿的情况,因此第一反应就是关闭硬件加速. 果然,关闭硬件加速后,页面 ... 
- centos7.2使用yum安装MariaDB10.1
			①添加MariaDB的yum源 1.创建MariaDB.repo sudo vi /etc/yum.repos.d/Mariadb.repo 2.将以下文件中的字段添加到MariaDB.repo文件中 ... 
- poj1789 最小生成树
			题目连接:http://poj.org/problem?id=1789 Description Advanced Cargo Movement, Ltd. uses trucks of differe ... 
- 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)
			layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ... 
