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 ...
随机推荐
- 遇到的css问题
1.上下两个div高度重叠:原因是上面的div中存在浮动,且没有设置高度,解决方案:外面再套一个div,设置高度或overflow:hidden 2.上下两个div存在间隙:原因是有div的displ ...
- Dubbo面试常见问题
一.dubbo是什么? dubbo是⼀个分布式服务框架,提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理方案.说白了其实dubbo就是一个远程调用的分布式框架. 二.dubbo的核心服务 ...
- NFS(网络文件系统)
NFS(网络文件系统) 1.关于NFS介绍 1.1NFS在企业中的应用场景 在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放 ...
- Codeforces 1175F 尺取法 性质分析
题意:给你一个数组,问有多少个区间,满足区间中的数构成一个排列. 思路(大佬代码):我们发现,一个排列一定含有1,所以我们不妨从1开始入手计算构成排列的区间个数.对于每个扫描到的1(假设处于位置i), ...
- 发布后台接口报错:could not load file or assembly 'mysql.data,' version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d
本地调试正常,但是服务器上面一直报错:could not load file or assembly 'mysql.data,' version=6.7.4.0, Culture=neutral, P ...
- vue中key的作用
1.v-if中用key管理可复用的元素 Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染.这么做,除了使 Vue 变得非常快之外,还有一些有用的好处.例如,如果你允许用户在不同的 ...
- eclipse Tomcat8.0端口占用报错和发布路径修改
实际上我是eclipse莫名其妙调试时崩了,结果再启动也无法启动tomcat报端口占用错 修改server.xml里的端口号不是好方法,改完运行报 “ 对不起! 这里不是Web服务器” 后来研究发 ...
- Yii2-rbac
下面介绍一个 yii2.0 的 Rbac 权限设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者ma ...
- Yii2中应用子模块下的内容
public function actionIndex(){ $article=\YII::$app->getModule('article'); $article->runAction( ...
- Jquery轻量级插件--操作URL
调用: > "?action=view§ion=info&id=123&debug&testy[]=true&testy[]=false ...