【Quartz】插件的使用
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。
Quartz 框架提供了几种用于扩展平台能力的方式。通过使用各种 "钩子" (通常指的就是扩展点),Quartz 变得很容易被扩展和定制化来适应你的需要。其中一个最简单的扩展框架的方法就是使用 Quartz 插件。本章就来看看如何使用插件机制让 Quartz 进入到之前 Quartz 用户没去过的领域。
一、使用Quartz自带插件范例
下面将使用插件实现从XML得到JOB,不用手工的把job和trigger加到Scheduler中去再来运行,这样就很方便。如果要更改任务,直接在xml中配置就可以了。不用再写java代码。
1、首先是job类:
import java.util.Date;
import java.util.Set;import org.quartz.DisallowConcurrentExecution;
import org.quartz.InterruptableJob;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.quartz.UnableToInterruptJobException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class SimpleJob implements Job {private static Logger log = LoggerFactory.getLogger(SimpleJob.class);private JobKey jobkey=null;@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {jobkey = context.getJobDetail().getKey();log.info("Excuting job: " + jobkey + " executing at " + new Date()+" fire by: "+context.getTrigger().getKey());if(context.getMergedJobDataMap().size()>0){Set<String> keys= context.getMergedJobDataMap().keySet();for (String key : keys) {String value= context.getMergedJobDataMap().getString(key);log.info(" jobdatamap entry: "+key+" = "+value);}context.setResult("hello");}}}
2、job触发时间配置,使用quartz_data.xml
<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"version="1.8"><pre-processing-commands><delete-jobs-in-group>*</delete-jobs-in-group> <!-- clear all jobs in scheduler --><delete-triggers-in-group>*</delete-triggers-in-group> <!-- clear all triggers in scheduler --></pre-processing-commands><processing-directives><!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them --><overwrite-existing-data>true</overwrite-existing-data><!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error --><ignore-duplicates>false</ignore-duplicates> </processing-directives><schedule><job><name>TestJob1</name><job-class>com.mucfc.SimpleJob</job-class></job><job><name>TestDurableJob</name><job-class>com.mucfc.SimpleJob</job-class><durability>true</durability><recover>false</recover></job><trigger><simple><name>TestSimpleTrigger1AtFiveSecondInterval</name><job-name>TestJob1</job-name><repeat-count>-1</repeat-count> <!-- repeat indefinitely --><repeat-interval>5000</repeat-interval> <!-- every 5 seconds --></simple></trigger><job><name>TestJob2</name><group>GroupOfTestJob2</group><description>This is the description of TestJob2</description><job-class>com.mucfc.SimpleJob</job-class><durability>false</durability><recover>true</recover><job-data-map><entry><key>someKey</key><value>someValue</value></entry><entry><key>someOtherKey</key><value>someOtherValue</value></entry></job-data-map></job><trigger><simple><name>TestSimpleTrigger2AtTenSecondIntervalAndFiveRepeats</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><start-time>2010-02-09T10:15:00</start-time><misfire-instruction>MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT</misfire-instruction><repeat-count>5</repeat-count><repeat-interval>10000</repeat-interval></simple></trigger><trigger><cron><name>TestCronTrigger2AtEveryMinute</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><job-data-map><entry><key>someKey</key><value>overriddenValue</value></entry><entry><key>someOtherKey</key><value>someOtherOverriddenValue</value></entry></job-data-map><cron-expression>0 * * ? * *</cron-expression></cron></trigger><trigger><cron><name>TestCronTrigger2AtEveryMinuteOnThe45thSecond</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><start-time>2015-05-12T12:26:00.0</start-time><end-time>2015-05-16T12:26:00.0</end-time><misfire-instruction>MISFIRE_INSTRUCTION_SMART_POLICY</misfire-instruction><cron-expression>45 * * ? * *</cron-expression><time-zone>America/Los_Angeles</time-zone></cron></trigger></schedule>
</job-scheduling-data>
3、配置文件
#============================================================================
# Configure Main Scheduler Properties
#============================================================================org.quartz.scheduler.instanceName: TestScheduler
org.quartz.scheduler.instanceId: AUTOorg.quartz.scheduler.skipUpdateCheck: true#============================================================================
# Configure ThreadPool
#============================================================================org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 3
org.quartz.threadPool.threadPriority: 5#============================================================================
# Configure JobStore
#============================================================================org.quartz.jobStore.misfireThreshold: 60000org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore#org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.useProperties: false
#org.quartz.jobStore.dataSource: myDS
#org.quartz.jobStore.tablePrefix: QRTZ_
#org.quartz.jobStore.isClustered: false#============================================================================
# Configure Datasources
#============================================================================#org.quartz.dataSource.myDS.driver: org.postgresql.Driver
#org.quartz.dataSource.myDS.URL: jdbc:postgresql://localhost/dev
#org.quartz.dataSource.myDS.user: jhouse
#org.quartz.dataSource.myDS.password:
#org.quartz.dataSource.myDS.maxConnections: 5#============================================================================
# Configure Plugins
#============================================================================org.quartz.plugin.triggHistory.class: org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames: quartz_data.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound: true
org.quartz.plugin.jobInitializer.scanInterval: 120
org.quartz.plugin.jobInitializer.wrapInUserTransaction: false
其中org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin会自动加载quartz_data.xml中的trigger和job到Scheduler
3、测试
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Matcher;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
import org.quartz.impl.matchers.KeyMatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class PluginExample {public static void run() throws Exception {Logger log = LoggerFactory.getLogger(PluginExample.class);SchedulerFactory sf = new StdSchedulerFactory();Scheduler sche = sf.getScheduler();sche.start();try {Thread.sleep(300000L);} catch (Exception e) {}sche.shutdown();SchedulerMetaData metaData = sche.getMetaData();log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");}public static void main(String[] args) {PluginExample simpleExample = new PluginExample();try {simpleExample.run();} catch (Exception e) {e.printStackTrace();}}
}
4、结果:
看,不用再把job和trigger手工加到Scheduler中去,它会自动加载XML中定义好的任务,需要做的只是start就行了。
转自: http://blog.csdn.net/evankaka
Quartz存储与持久化-基于quartz.properties的配置 见原博主另一文:https://blog.csdn.net/Evankaka/article/details/45556207
【Quartz】插件的使用相关推荐
- 在Grails中使用Quartz插件实现定时任务
Quartz插件可以使Grails应用程序按照指定的时间间隔或cron表达式来执行调度任务.Grails系统通过spring配置使用Quartz Enterprise Job Scheduler 实现 ...
- quartz定时器依赖_Grails集成Quartz插件实现定时任务(Job)
build.gradle依赖: //定时器 compile 'org.grails.plugins:quartz:2.0.0.M4' 创建一个job,执行命令: create-job com.test ...
- Quartz - 作业调度框架-插件化开发
背景 大部分业务都是基于定时的任务,特别适合使用quartz这类框架解决定时问题.具体quartz的使用,看官方文档就可以了.下面谈谈对quartz插件化的封装.我们使用quartz.plugin.然 ...
- Quartz Scheduler插件–隐藏的宝藏
尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用. 本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册. 您可以自由编写自己的插件,但我们将专注于 ...
- jfinal整合quartz实现定时任务的两种方式
第一种实现方式 1.导入包 <dependency> <groupId>org.quartz-scheduler</groupId> ...
- Hello Quartz (第三部分)
声明式部署一个 Job 前面我们讨论过,尽可能的用声明式处理软件配置,其次才才虑编程式.再来看代码 3.6,如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译.这种方式只 ...
- 【Quartz】任务调度
Quartz任务调度 一.Quartz概念 二.Quartz运行环境 三.Quartz设计模式 四.Quartz学习的核心概念 五.Quartz的体系结构 六.Quartz的几个常用API 七.Qua ...
- Quartz任务调度——快速入门
目录 一.Quartz概念 二.Quartz运行环境 三.Quartz设计模式 四.Quartz学习的核心概念 五.Qutarz的体系结构 六.Quartz的几个常用API 七.Quartz的使用 八 ...
- Quartz配置资源介绍
1.配置.资源SchedulerFactory Quartz以模块方式架构,因此要使它运行.几个组件必须要很好的咬合在一起.[现在已经有了一些现成的助手可以完成这些工作] 所有scheduler实例是 ...
最新文章
- ASP.NET页面错误处理
- python3 filter 列表元素过滤(匹配)用法
- 开发人员学Linux(2):VirtualBox中安装CentOS7系统设置
- linux,apache,php,mysql常用的查看版本信息的方法
- C# 的TCPClient异步连接与异步读数据
- php7引用计数,PHP7 引用计数 读书笔记
- 云计算-从基础到应用架构系列-云计算的演进
- Git初学札记(零)————EGIT完成Eclipse到GitHub一条龙
- 32岁已育国企技术女,上升无望,下一步如何做?
- 【Flink】flink1.11报错No ExecutorFactory found to execute the application
- Vue-router学习(一)- 路由匹配
- SAP屏幕设计器专题:表格控件属性的设定(七)
- .NET 6 Preview 5 终于发布
- android系统预制app/bin/.so文件及文件夹
- Nodejs ---- 升级到指定版本
- 《软件架构与设计模式》思维导图
- LaTex 常用数学公式符号速记
- 一维条码之code93码的生成和打印
- Linux查询IP失败
- Android 获取本地视频列表
热门文章
- Python CheckiO 题解系列 丨 博客目录索引
- java s1=abc s2=abc s1==s2_经典问题:String s1 = abc 与 String s2 = new String(abc)的区别...
- 【NC14 按之字形顺序打印二叉树】
- 【CodeForces - 746E】Numbers Exchange(贪心构造)
- 【牛客 - 368C】流星雨(概率dp,乘法逆元)
- 【CodeForces - 798D】Mike and distribution (思维构造,贪心,黑科技)
- 2.2)深度学习笔记:优化算法
- java applet socket_Java swing applet中使用的套接字
- 如何将文件拷贝服务器上,如何将文件复制到云服务器上
- 在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。 * (静态初始化一个数组,在数组中随意写入6个分数) 选手的最后得分为: * 去掉一个最高分和一个最低分后 的4个评委平均值。