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包下,其内部包含且仅 ...
随机推荐
- SpringMVC - 个人对@ModelAttribute的见解 和 一些注入参数、返回数据的见解
2016-8-23修正. 因为对modelattribute这个注解不了解,所以在网上搜寻一些答案,感觉还是似懂非懂的,所以便自己测试,同时还结合网上别人的答案:最后得出我自己的见解和结果,不知道正确 ...
- 4.flume实战(一)
需求:从指定网络端口采集数据输出到控制台 使用flume的关键就是写配置文件 a)配置source b)配置channel c)配置sink d)把以上三个组件串起来 我们看一下官网给的配置文件 # ...
- [ Openstack ] Openstack-Mitaka 高可用之 Mariadb-Galera集群部署
目录 Openstack-Mitaka 高可用之 概述 Openstack-Mitaka 高可用之 环境初始化 Openstack-Mitaka 高可用之 Mariadb-Galera集群 ...
- mysql 使用set names 解决乱码问题
引子: 最近查询公司线上表数据,返现在Xshell控制台打印的数据都是乱码,记得之前瞄过同事都是执行set names UTF8 , 解决的,特记录如下.
- svn泄漏敏感信息利用方式
之前仅知道svn权限配置不当,会导致敏感信息泄漏,但是一直不知道具体利用方式. 今天测试svn dig时抓包分析才知道: http://www.xxx.com/路径/.svn/text-base/文件 ...
- eclispe新导入的文件有个小红叉号(x)的问题
关于这个问题,我百度了很久,后面发现很简单的就解决了:我觉得可能大家的问题不一样,或许解决方法可能是一样的: 参考链接:https://zhidao.baidu.com/question/616762 ...
- 操作Image,封装的方法
using System; using System.Collections; using System.IO; using System.Drawing; using System.Drawing. ...
- DFS之奇偶剪枝
问题描述: 给定一个 N * M的迷宫+起点+终点 ,迷宫中有一些障碍无法穿过,问能否不重复也不停留地在刚好一共走 t 步出迷宫. 先上结论: 在理想情况下,s到e需要的最小步数为m=|ex-sx|+ ...
- UVA 699 The Falling Leaves (递归先序建立二叉树)
题目链接:http://acm.hust.edu.cn/vjudge/problem/19244 #include <iostream> #include <cstdio> # ...
- 【贪心】Codeforces Round #401 (Div. 2) D. Cloud of Hashtags
从后向前枚举字符串,然后从左向右枚举位. 如果该串的某位比之前的串的该位小,那么将之前的那串截断. 如果该串的某位比之前的串的该位大,那么之前那串可以直接保留全长度. 具体看代码. #include& ...