前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

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】插件的使用相关推荐

  1. 在Grails中使用Quartz插件实现定时任务

    Quartz插件可以使Grails应用程序按照指定的时间间隔或cron表达式来执行调度任务.Grails系统通过spring配置使用Quartz Enterprise Job Scheduler 实现 ...

  2. quartz定时器依赖_Grails集成Quartz插件实现定时任务(Job)

    build.gradle依赖: //定时器 compile 'org.grails.plugins:quartz:2.0.0.M4' 创建一个job,执行命令: create-job com.test ...

  3. Quartz - 作业调度框架-插件化开发

    背景 大部分业务都是基于定时的任务,特别适合使用quartz这类框架解决定时问题.具体quartz的使用,看官方文档就可以了.下面谈谈对quartz插件化的封装.我们使用quartz.plugin.然 ...

  4. Quartz Scheduler插件–隐藏的宝藏

    尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用. 本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册. 您可以自由编写自己的插件,但我们将专注于 ...

  5. jfinal整合quartz实现定时任务的两种方式

    第一种实现方式 1.导入包 <dependency>             <groupId>org.quartz-scheduler</groupId>    ...

  6. Hello Quartz (第三部分)

    声明式部署一个 Job 前面我们讨论过,尽可能的用声明式处理软件配置,其次才才虑编程式.再来看代码  3.6,如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译.这种方式只 ...

  7. 【Quartz】任务调度

    Quartz任务调度 一.Quartz概念 二.Quartz运行环境 三.Quartz设计模式 四.Quartz学习的核心概念 五.Quartz的体系结构 六.Quartz的几个常用API 七.Qua ...

  8. Quartz任务调度——快速入门

    目录 一.Quartz概念 二.Quartz运行环境 三.Quartz设计模式 四.Quartz学习的核心概念 五.Qutarz的体系结构 六.Quartz的几个常用API 七.Quartz的使用 八 ...

  9. Quartz配置资源介绍

    1.配置.资源SchedulerFactory Quartz以模块方式架构,因此要使它运行.几个组件必须要很好的咬合在一起.[现在已经有了一些现成的助手可以完成这些工作] 所有scheduler实例是 ...

最新文章

  1. ASP.NET页面错误处理
  2. python3 filter 列表元素过滤(匹配)用法
  3. 开发人员学Linux(2):VirtualBox中安装CentOS7系统设置
  4. linux,apache,php,mysql常用的查看版本信息的方法
  5. C# 的TCPClient异步连接与异步读数据
  6. php7引用计数,PHP7 引用计数 读书笔记
  7. 云计算-从基础到应用架构系列-云计算的演进
  8. Git初学札记(零)————EGIT完成Eclipse到GitHub一条龙
  9. 32岁已育国企技术女,上升无望,下一步如何做?
  10. 【Flink】flink1.11报错No ExecutorFactory found to execute the application
  11. Vue-router学习(一)- 路由匹配
  12. SAP屏幕设计器专题:表格控件属性的设定(七)
  13. .NET 6 Preview 5 终于发布
  14. android系统预制app/bin/.so文件及文件夹
  15. Nodejs ---- 升级到指定版本
  16. 《软件架构与设计模式》思维导图
  17. LaTex 常用数学公式符号速记
  18. 一维条码之code93码的生成和打印
  19. Linux查询IP失败
  20. Android 获取本地视频列表

热门文章

  1. Python CheckiO 题解系列 丨 博客目录索引
  2. java s1=abc s2=abc s1==s2_经典问题:String s1 = abc 与 String s2 = new String(abc)的区别...
  3. 【NC14 按之字形顺序打印二叉树】
  4. 【CodeForces - 746E】Numbers Exchange(贪心构造)
  5. 【牛客 - 368C】流星雨(概率dp,乘法逆元)
  6. 【CodeForces - 798D】Mike and distribution (思维构造,贪心,黑科技)
  7. 2.2)深度学习笔记:优化算法
  8. java applet socket_Java swing applet中使用的套接字
  9. 如何将文件拷贝服务器上,如何将文件复制到云服务器上
  10. 在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。 * (静态初始化一个数组,在数组中随意写入6个分数) 选手的最后得分为: * 去掉一个最高分和一个最低分后 的4个评委平均值。