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());
	}

}

  

时间: 2024-08-09 21:58:49

Quartz任务监听器的相关文章

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

namespace Quartz.Listener { public class SchedulerListener : SchedulerListenerSupport { private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); public override void JobAdded(

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

1. 概述 Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.TriggerListener.SchedulerListener三种,顾名思义,分别表示任务.触发器.调度器对应的监听器.三者的使用方法类似,在开始介绍三种监听器之前,需要明确两个概念:全局监听器与非全局监听器,二者的区别在于:全局监听器能够接收到所有的Job/Trigger的事件通知,而非全局监听器只能接收到

Quartz入门 (四) 监听器Listener

Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz 的监听器有Job监听器,Trigger监听器, Scheduler监听器,对不同层面进行监控.三者的使用方法类似,在开始介绍三种监听器之前,需要明确两个概念:全局监听器与非全局监听器,二者的区别在于:全局监听器能够接收到所有的Job/Trigger的事件通知,而非全局监听器只能接收到在其上注册的Job或Trigger的事件,不在其上注册的Job或Trigge

关于Quartz那点事(一)

一.文章的由来 近来,由于公司运营的系统比较多,而且都是用集群做的负载均衡,从而产生了一些问题需要解决.我们知道,集群环境下,我们写的程序会被部署到集群的每个点上去运行.这种情况下,我们的后台定时任务将会被每个点都执行一遍.如果是全局性质的任务,则会产生逻辑上的错误.一般情况下,全局任务,同一时间只能有一个实例在执行.局部任务可以每个点都(并行调度)运行. 我所要解决的,就是全局任务的调度问题.并且,研发的任务调度系统也要支持集群技术,在任务量扩大的情况下,可以有较强的伸缩性和可靠性. 根据以往

Net作业调度(二) - Quartz.Net进阶

介绍 前面我们介绍Quartz.Net的基本用法,但在实际应用中,往往有更多的特性需求.   比如记录job执行的执行历史,发邮件等. 目录 1:Quartz.Net插件 2:TriggerListener,JobListener 3:Cron表达式 4:Quartz.Net 线程池 5:总结 Quartz.Net插件 Quartz.net 自身提供了一个插件接口(ISchedulerPlugin)用来增加附加功能. 我们来看下官方定义: public interface ISchedulerP

Spring Boot集成quartz实现定时任务并支持切换任务数据源

org.quartz实现定时任务并自定义切换任务数据源 在工作中经常会需要使用到定时任务处理各种周期性的任务,org.quartz是处理此类定时任务的一个优秀框架.随着项目一点点推进,此时我们并不满足于任务仅仅是定时执行,我们还想要对任务进行更多的控制,随时能对任务进行人为干预,就需要对quartz有更深入的了解.而随着微服务的流行,项目中多数据源的情况也越来越常见,在定时任务中集成多数据源切换的功能也需要集成进来. 集成quartz实现定时任务 集成quartz实现定时任务 quartz中实现

Net作业调度

Net作业调度(一) -Quartz.Net入门 2014-11-01 13:14 by 蘑菇先生, 13954 阅读, 7 评论, 收藏, 编辑 背景 很多时候,项目需要在不同时刻,执行一个或很多个不同的作业. Windows执行计划这时并不能很好的满足需求了,迫切需要一个更为强大,方便管理,集群部署的作业调度框架. 介绍 Quartz一个开源的作业调度框架,OpenSymphony的开源项目.Quartz.Net 是Quartz的C#移植版本. 它一些很好的特性: 1:支持集群,作业分组,作

Java定时任务调度详解

前言 在实际项目开发中,除了Web应用.SOA服务外,还有一类不可缺少的,那就是定时任务调度.定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券:比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作:比如一些定时需要生成的报表.邮件:比如一些需要定时清理数据的任务等.本篇博客将系统的介绍定时任务调度,会涵盖Timer.ScheduledExecutorService.开源工具包Quartz,以及Spring和Quartz的结合

Spring容器初始化后执行的方法

在项目中, 会遇到要在容器加载完就做一些初始化, 例如Quartz的监听器重新注册(Quartz监听器在RAM中的, Web容器重启或关闭会丢失)等需求. <span style="font-family:Microsoft YaHei;font-size:18px;">import org.springframework.context.ApplicationListener; import org.springframework.context.event.Contex