A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孤尽 中级黑马   /  2019-12-31 08:42  /  1255 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孤尽 于 2019-12-31 08:45 编辑

Spring Boot 整合 Quartz
配置pom
Spring Boot 使用的是2.1.6.RELEASE,依赖中增加如下配置
[XML] 纯文本查看 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
application.properties
调度器可以和springboot公用数据源
[Java] 纯文本查看 复制代码
#使用数据库固化调度信息[/size][/font][/color][/align]spring.quartz.job-store-type=jdbc
#调度器名称
spring.quartz.scheduler-name=MyScheduler
#不重新创建数据表
spring.quartz.jdbc.initialize-schema=never
#线程数量
spring.quartz.properties.org.quartz.threadPool.threadCount = 50
#持久化实现
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#数据库方言StdJDBCDelegate 
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate 

java代码
任务:实现Job接口即可
[Java] 纯文本查看 复制代码
public interface Job {
    //context中包含当前任务关联的信息 
    //JobExecutionException 当任务执行失败时可以通过配置来控制是否继续执行等操作
    void execute(JobExecutionContext context) throws JobExecutionException;
}
调度器:在service中注入Scheduler即可,Scheduler是调度器整体管理包括暂停任务,更新任务,恢复任务等
需求以及解决方法
每个任务使用相同上下文即JobData
继承Job的java类上增加@PersistJobDataAfterExecution,@DisallowConcurrentExecution注解,通常这两个注解配合使用
  • @PersistJobDataAfterExecution:在任务执行后固化JobData至数据库
  • @DisallowConcurrentExecution:避免同一个组的同一个任务并发执行以免JobData混乱
更新JobData至当前任务
[Java] 纯文本查看 复制代码
   //jobDetail 任务信息
   JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(job.getName(), job.getGroup()));
   jobDetail.getJobDataMap().put("aaa", "bbb");
   CronTrigger trigger = (CronTrigger) scheduler.getTrigger(TriggerKey.triggerKey(job.getName(), job.getGroup()));
   Set<Trigger> triggers = new HashSet<>();
   triggers.add(trigger);
   //true 就是替换数据库中JobDataMap
   scheduler.scheduleJob(jobDetail,triggers,true);
任务控制
  • 暂停任务:scheduler.pauseJob(jobKey)
  • 恢复任务:scheduler.resumeJob(jobKey)
  • 立即执行任务:scheduler.triggerJob(jobKey)
  • 执行中的任务:
[Java] 纯文本查看 复制代码
List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs()
//获取具体任务信息
JobDetail jobDetail = executingJob.getJobDetail();


查询任务
[Java] 纯文本查看 复制代码
   //依据分组查询,如需其他查找查看api中实现了org.quartz.Matcher接口的类即可
   GroupMatcher<JobKey> matcher = GroupMatcher.groupContains(groupKeyword);
   Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
   //通过JobKey获取调度器中具体任务以及相关信息 
   scheduler.getJobDetail(jobKey); 


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马