quartz的使用(一)
1.quartz是什么?
Quartz 是一个完全由 Java 编写的开源作业调度框架,支持各种灵活的应用方式,并同时支持分布式和集群能力。2.quartz的基本要素
2.quartz的基本要素
Scheduler 代表一个调度容器 JobDetail 表示一个具体的可执行的调度程序
Trigger 代表一个调度参数的配置
Job 表示一个工作,要执行的具体内容
3.quartz结合springboot使用(maven工程)
3.1 引入包 pom文件
<!-- quartz及spring任务支持 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 使用HikariCP数据库连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<!-- 工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3.2 先自定义一个类实现spring的QuartzJobBean并重写executeInternal,该类实现了Job类
@Slf4j
public class MyJob extends QuartzJobBean { @Override
public void executeInternal(JobExecutionContext context){
log.info("线程【{}】开始执行,时间【{}】",Thread.currentThread().getName(),new Date());
}
}
3.3 创建JobDetail,Trigger
@Configuration
public class JobDetailAndTriggerConfig {
@Bean("myJobDetail")
public JobDetailFactoryBean getJobDetail(){
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
//Job的实现类类对象
jobDetailFactoryBean.setJobClass(MyJob.class);
//任务的名称,框架需要通过此名称进行关联,所以需要保证唯一性
jobDetailFactoryBean.setName("myJob");
//任务组,默认为“DEFAULT”,取值Scheduler.DEFAULT_GROUP
jobDetailFactoryBean.setGroup("myJob Group");
//任务描述信息,可以用来传递字符串参数,但是尽量不要这么干
jobDetailFactoryBean.setDescription("myJob Description");
//类似Map类,可以通过此类的对象向Job的execute方法中传递业务参数
//jobDetailFactoryBean.setJobDataMap(null);
//Job执行完后是否继续持久化到数据库,默认为false
jobDetailFactoryBean.setDurability(true);
return jobDetailFactoryBean;
}
@Bean("myJobTrigger")
public CronTriggerFactoryBean getTrigger(@Qualifier("myJobDetail")JobDetail jobDetail){
//使用cronTrigger
CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
//自定义的jobDetail对象
triggerFactoryBean.setJobDetail(jobDetail);
//触发器的名称
triggerFactoryBean.setName("myJobTrigger");
//触发器的任务组
triggerFactoryBean.setGroup("myJobTrigger group");
//触发器的描述信息
triggerFactoryBean.setDescription("myJobTrigger description");
//cron表达式
triggerFactoryBean.setCronExpression("0/3 * * * * ?");
//延迟时间
triggerFactoryBean.setStartDelay(0);
//设置misfire的任务策略;MISFIRE_INSTRUCTION_DO_NOTHING则不对misfire的任务做特殊处理,只从当前时间之后的下一次正常调度时间开始执行
triggerFactoryBean.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
//类似Map类,可以通过此类的对象向Job的execute方法中传递业务参数
//triggerFactoryBean.setJobDataMap(null);
return triggerFactoryBean;
}
}
3.4 创建Scheduler 并注册JobDetail,Trigger,然后启动Scheduler
@Slf4j
@Configuration
public class QuartzSchedulerConfig {
@Autowired
private DataSource dataSource;
@Bean
public SchedulerFactoryBean schedulerFactoryBean(ApplicationContext applicationContext) {
//创建调度器工厂
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
//设置覆盖任务
schedulerFactory.setOverwriteExistingJobs(true);
schedulerFactory.setDataSource(dataSource);
schedulerFactory.setSchedulerName("myTestScheduler");
schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));
Map<String, Trigger> triggers = applicationContext.getBeansOfType(Trigger.class);
Collection<Trigger> triggerList = (null != triggers && !triggers.isEmpty()) ? triggers.values(): Collections.emptyList();
schedulerFactory.setTriggers(triggerList.toArray(new Trigger[triggerList.size()]));
//schedulerFactory.setJobFactory();不设置时使用默认的AdaptableJobFactory,可以自定义继承SpringBeanJobFactory
// 并且要将createJobInstance()创建的实例交由spring自动注入这样才能在job执行方法中注入spring的其他实例,如使用@Service或其他注解的对象自动注入
return schedulerFactory;
}
}
3.5 配置quartz配置文件及数据源文件
# 数据源相关配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mytest?tinyInt1isBit=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
hikari:
connection-test-query: SELECT 1 FROM DUAL
minimum-idle: 3
maximum-pool-size: 24
pool-name: ${spring.application.name}-CP
idle-timeout: 10000
leakDetectionThreshold: 2000
#quartz配置
#调度标识名 集群中每一个实例都必须使用相同的名称 (区分特定的调度器实例)
org.quartz.scheduler.instanceName=bpsp-service-job
#ID设置为自动获取 每一个必须不同 (所有调度器实例中是唯一的)
org.quartz.scheduler.instanceId=AUTO
#线程数量
org.quartz.threadPool.threadCount=5
#数据保存方式为持久化 (也可以指定使用本地内存)
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#指定委托类
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#设置为TRUE不会出现序列化非字符串类到 BLOB 时产生的类版本问题
org.quartz.jobStore.useProperties=true
#容许的最大作业延长时间(超过该事件则为misfire)
org.quartz.jobStore.misfireThreshold=60000
#表的前缀
org.quartz.jobStore.tablePrefix=qrtz_
#加入集群 true 为集群 false不是集群
org.quartz.jobStore.isClustered=true
#调度实例失效的检查时间间隔
org.quartz.jobStore.clusterCheckinInterval=20000
#自带的管理组件plugin
org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown=TRUE
org.quartz.plugin.triggHistory.class=org.quartz.plugins.history.LoggingTriggerHistoryPlugin
org.quartz.plugin.jobHistory.class=org.quartz.plugins.history.LoggingJobHistoryPlugin
#每次获取trigger时加锁(默认false)
org.quartz.jobStore.acquireTriggersWithinLock=true
4.运行结果
2019-06-06 17:41:45.030 INFO 7532 --- [eduler_Worker-4] com.example.springbootquartz.job.MyJob : 线程【myTestScheduler_Worker-4】开始执行,时间【Thu Jun 06 17:41:45 CST 2019】
2019-06-06 17:41:45.030 INFO 7532 --- [eduler_Worker-4] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob execution complete at 17:41:45 06/06/2019 and reports: null
2019-06-06 17:41:45.042 INFO 7532 --- [eduler_Worker-4] o.q.p.h.LoggingTriggerHistoryPlugin : Trigger myJobTrigger group.myJobTrigger completed firing job myJob Group.myJob at 17:41:45 06/06/2019 with resulting trigger instruction code: DO NOTHING
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] o.q.p.h.LoggingTriggerHistoryPlugin : Trigger myJobTrigger group.myJobTrigger fired job myJob Group.myJob at: 17:41:48 06/06/2019
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob fired (by trigger myJobTrigger group.myJobTrigger) at: 17:41:48 06/06/2019
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] com.example.springbootquartz.job.MyJob : 线程【myTestScheduler_Worker-5】开始执行,时间【Thu Jun 06 17:41:48 CST 2019】
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob execution complete at 17:41:48 06/06/2019 and reports: null
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] o.q.p.h.LoggingTriggerHistoryPlugin : Trigger myJobTrigger group.myJobTrigger completed firing job myJob Group.myJob at 17:41:48 06/06/2019 with resulting trigger instruction code: DO NOTHING
2019-06-06 17:41:51.035 INFO 7532 --- [eduler_Worker-1] o.q.p.h.LoggingTriggerHistoryPlugin : Trigger myJobTrigger group.myJobTrigger fired job myJob Group.myJob at: 17:41:51 06/06/2019
2019-06-06 17:41:51.036 INFO 7532 --- [eduler_Worker-1] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob fired (by trigger myJobTrigger group.myJobTrigger) at: 17:41:51 06/06/2019
2019-06-06 17:41:51.036 INFO 7532 --- [eduler_Worker-1] com.example.springbootquartz.job.MyJob : 线程【myTestScheduler_Worker-1】开始执行,时间【Thu Jun 06 17:41:51 CST 2019】
2019-06-06 17:41:51.036 INFO 7532 --- [eduler_Worker-1] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob execution complete at 17:41:51 06/06/2019 and reports: null
quartz的使用(一)的更多相关文章
- 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...
- Quartz
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度. eg: ja ...
- Spring Quartz实现任务调度
任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...
- topshelf和quartz内部分享
阅读目录: 介绍 基础用法 调试及安装 可选配置 多实例支持及相关资料 quartz.net 上月在公司内部的一次分享,现把PPT及部分交流内容整理成博客. 介绍 topshelf是创建windows ...
- Quartz.net持久化与集群部署开发详解
序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项 ...
- Quartz.net开源作业调度框架使用详解
前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不 ...
- quartz.net 时间表达式----- Cron表达式详解
序言 Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net中所认知执行,可想而知这是多么的天衣无 ...
- Quartz.NET Windows 服务示例
想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度引入进来了,那今天就简单的介绍一下 Quartz ...
- [Quartz笔记]玩转定时调度
简介 Quartz是什么? Quartz是一个特性丰富的.开源的作业调度框架.它可以集成到任何Java应用. 使用它,你可以非常轻松的实现定时任务的调度执行. Quartz的应用场景 场景1:提醒和告 ...
- 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能
Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...
随机推荐
- Codeforces 348D DP + LGV定理
题意及思路:https://www.cnblogs.com/chaoswr/p/9460378.html 代码: #include <bits/stdc++.h> #define LL l ...
- Array Beauty
Array Beauty 给出一个长度为n的序列\(\{a_i\}\),定义一个序列的权值为其中元素两两之差的绝对值的最小值,询问\(\{a_i\}\)长度为K的子序列的权值之和\(\% 998244 ...
- elementUI 日期时间选择器 只能选择当前及之后的时间
日期时间选择器 只能选择当前及之后的时间 <el-date-picker class="input-border-null" prefix-icon="el-ic ...
- thinkphp rpc
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...
- SQL语句常用优化技巧
提高SQL语句的执行效率,最常见的方法就是建立索引,以及尽量避免全表扫描. ①.避免在where子句中使用 is null 或 is not null 对字段进行判断. 如:select id fro ...
- spring AOP (使用AspectJ的xml方式 的aop实现) (7)
目录 一.定义计算器接口跟实现类 二.定义两个切面,日志切面和验证切面 三.在xml中配置切面 四.测试类 一.定义计算器接口跟实现类 public interface ArithmeticCalcu ...
- ios移动输入框被软键盘遮挡
页面输入框会出现被软键盘挡住的问题: 解决方法:获取input点击事件设置body高度 $('input').bind('click',function(e){ var $this = $(this) ...
- tp U函数 logs
注意 U 函数 项目今天已经搞定了本以为可以上线了没问题了,但是 当我把tp调试模式关闭后: define('APP_DEBUG',false); 页面完全加载不出来,于是开启: 'SHO ...
- 6-23 EDM的报告
EDM营销(Email Direct Marketing)也即:Email营销. 目的:数据分析.制定一对一的个性化数据.提高用户访问率.EDM是一对一的沟通,让你的用户感觉到尊重, 方式:选择强有力 ...
- [经典]Python 一篇学会多线程
对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的MS-DOS时代,操作系统处理问题都是单任 ...