quart
quartz原理
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便。
Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。
1 2 3 4 5 6 7 8 9 10 |
1、Job 表示一个工作,要执行的具体内容。此接口中只有一个方法 void execute(JobExecutionContext context) 2、JobDetail JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。 3、Trigger代表一个调度参数的配置,什么时候去调。 4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。 |
小案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.Date; /** * quartz定时器测试 */ public class MyJob implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println(new Date() + ": doing something..."); } } class Test { public static void main(String[] args) { //1、创建JobDetial对象 JobDetail jobDetail = new JobDetail(); //设置工作项 jobDetail.setJobClass(MyJob.class); jobDetail.setName("MyJob_1"); jobDetail.setGroup("JobGroup_1"); //2、创建Trigger对象 SimpleTrigger strigger = new SimpleTrigger(); strigger.setName("Trigger_1"); strigger.setGroup("Trigger_Group_1"); strigger.setStartTime(new Date()); //设置重复停止时间,并销毁该Trigger对象 java.util.Calendar c = java.util.Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis() + 1000 * 1L); strigger.setEndTime(c.getTime()); strigger.setFireInstanceId("Trigger_1_id_001"); //设置重复间隔时间 strigger.setRepeatInterval(1000 * 1L); //设置重复执行次数 strigger.setRepeatCount(3); //3、创建Scheduler对象,并配置JobDetail和Trigger对象 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = null; try { scheduler = sf.getScheduler(); scheduler.scheduleJob(jobDetail, strigger); //4、并执行启动、关闭等操作 scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } // try { // //关闭调度器 // scheduler.shutdown(true); // } catch (SchedulerException e) { // e.printStackTrace(); // } } } |
运行案例
1 2 3 |
//4、并执行启动、关闭等操作 scheduler.start(); scheduler.shutdown(true); |
结果
1 2 3 |
Thu Jul 23 10:11:50 CST 2009: doing something... Process finished with exit code 0 |
总结
1 2 3 4 5 6 7 8 9 |
1、scheduler是一个计划调度器容器(总部),容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。 2、JobDetail是一个可执行的工作,它本身可能是有状态的。 3、Trigger代表一个调度参数的配置,什么时候去调。 4、当JobDetail和Trigger在scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成的一对儿),就可以伴随容器启动而调度执行了。 5、scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。 |
在spring 中的应用
引入jar包
1 2 |
// https://mvnrepository.com/artifact/org.quartz-scheduler/quartz compile group: 'org.quartz-scheduler', name: 'quartz', version: '2.3.0' |
spring配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!-- 定义一个任务类 --> <bean id="myJob" class="com.item1024.quartz.TimeTask"></bean> <!-- jobDetail --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="myJob"></property> <property name="targetMethod" value="racWallet"></property> <property name="concurrent" value="false" /><!-- 作业不并发调度 false 任务未执行完不会执行下一个任务 --> </bean> <!-- 定义trigger 触发器 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail"></property> <property name="cronExpression" value="*/10 * * * * ?"></property> <!-- 十秒一次 --> </bean> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean> |
任务调度类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.item1024.quartz; import com.item1024.bean.TransBean; import com.item1024.constant.TylConstant; import com.item1024.mapper.TransLogMapper; import com.item1024.pojo.TransLog; import com.item1024.service.OpCoinService; import com.item1024.service.UserWalletRacService; import javax.annotation.Resource; import java.util.Date; import java.util.List; /** * @author 阳十三 * @email [email protected] * @blog http://www.item1024.com * @date 2017/8/30 */ public class TimeTask { public void racWallet() { System.out.println("交易任务开启: "); } } |
相关阅读
Quartus II 13.0 最全的安装、破解教程(包含下载地址)
一、 首先是Quartus II 13.0.1 软件的下载 如果你没有那么高的要求,用个低版本的Quartus II 就足够了,而且低版本的软件比较稳定, 为
spring Quartz 源码分析--触发器类CronTriggerBean源
前面我们讲到了Quartz框架在项目中的实现,在Quartz中的重要API有两个重要的触发器类:CronTrigger 和SimpleTrigger 在Quartz框
0 前言Quartz的配置通常是使用properties文件结合StdSchedulerFactory完成的。StdSchedulerFactory读取配置文件,并实例化schedule
Quartz与Spring集成—— SchedulerFactoryBean的初始
前言 Quartz是一个开源的定时调度框架,支持集群部署。我们可以通过其Java API来使用它,或者通过Spring来配置与管理,也可以结合使用
CronTrigger配置格式:格式: [秒] [分] [小时] [日] [月] [周] [年] 序号说明 是否必填 允许填写的值允许的通配符 1 秒 是