boot-admin整合Quartz实现动态管理定时任务

打印 上一主题 下一主题

主题 879|帖子 879|积分 2637

淄博烧烤爆红出了圈,当你坐在八大局的烧烤摊,面前是火炉、烤串、小饼和蘸料,音乐响起,啤酒倒满,烧烤灵魂的party即将开场的时候,你系统中的Scheduler(调试器),也自动根据设定的Trigger(触发器),从容优雅的启动了一系列的Job(后台定时任务)。工作一切早有安排,又何须费心劳神呢?因为boot-admin早已将Quartz这块肉串在了烤签上!
项目源码仓库github
项目源码仓库gitee

Quartz是一款Java编写的开源任务调度框架,同时它也是Spring默认的任务调度框架。它的作用其实类似于Timer定时器以及ScheduledExecutorService调度线程池,当然Quartz作为一个独立的任务调度框架表现更为出色,功能更强大,能够定义更为复杂的执行规则。
boot-admin 是一款采用前后端分离模式、基于 SpringCloud 微服务架构 + vue-element-admin 的 SaaS 后台管理框架。
那么boot-admin怎样才能将Quartz串成串呢?一共分三步:
加入依赖
  1. <dependency>
  2.   <groupId>org.quartz-scheduler</groupId>
  3.   <artifactId>quartz</artifactId>
  4.   <version>2.3.2</version>
  5. </dependency>
复制代码
前端整合

vue页面以el-table作为任务的展示控件,串起任务的创建、修改、删除、挂起、恢复、状态查看等功能。
vue页面
  1. <template>
  2.   
  3.    
  4.    
  5.       
  6.         <el-button size="mini" type="primary" @click="search()">查询</el-button>
  7.         <el-button size="mini" type="primary" @click="handleadd()">添加</el-button>
  8.       
  9.       
  10.         
  11.         
  12.           <el-pagination
  13.             :current-page="BaseTableData.page.currentPage"
  14.             :page-sizes="[5,10,20,50,100,500]"
  15.             :page-size="BaseTableData.page.pageSize"
  16.             layout="total, sizes, prev, pager, next, jumper"
  17.             :total="BaseTableData.page.total"
  18.             @size-change="handlePageSizeChange"
  19.             @current-change="handlePageCurrentChange"
  20.           />
  21.         
  22.         
  23.       
  24.    
  25.    
  26.    
  27.     <el-table max-height="100%" :data="BaseTableData.table"  :border="true">
  28.       <el-table-column type="index" :index="indexMethod" />
  29.       <el-table-column prop="jobName" label="任务名称" width="100px" />
  30.       <el-table-column prop="jobGroup" label="任务所在组" width="100px" />
  31.       <el-table-column prop="jobClassName" label="任务类名" />
  32.       <el-table-column prop="cronExpression" label="表达式" width="120" />
  33.       <el-table-column prop="timeZoneId" label="时区" width="120" />
  34.       <el-table-column prop="startTime" label="开始" width="120" :formatter="(row,column,cellValue) => dateTimeColFormatter(row,column,cellValue)"/>
  35.       <el-table-column prop="nextFireTime" label="下次" width="120" :formatter="(row,column,cellValue) => dateTimeColFormatter(row,column,cellValue)"/>
  36.       <el-table-column prop="previousFireTime" label="上次" width="120" :formatter="(row,column,cellValue) => dateTimeColFormatter(row,column,cellValue)"/>
  37.       <el-table-column prop="triggerState" label="状态" width="80">
  38.         <template slot-scope="scope">
  39.           <p v-if="scope.row.triggerState=='NORMAL'">等待</p>
  40.           <p v-if="scope.row.triggerState=='PAUSED'">暂停</p>
  41.           <p v-if="scope.row.triggerState=='NONE'">删除</p>
  42.           <p v-if="scope.row.triggerState=='COMPLETE'">结束</p>
  43.           <p v-if="scope.row.triggerState=='ERROR'">错误</p>
  44.           <p v-if="scope.row.triggerState=='BLOCKED'">阻塞</p>
  45.         </template>
  46.       </el-table-column>
  47.       <el-table-column label="操作" width="220px">
  48.         <template slot-scope="scope">
  49.           <el-button type="warning" size="least" title="挂起" @click="handlePause(scope.row)">挂起</el-button>
  50.           <el-button type="primary" size="least" title="恢复" @click="handleResume(scope.row)">恢复</el-button>
  51.           <el-button type="danger" size="least" title="删除" @click="handleDelete(scope.row)">删除</el-button>
  52.           <el-button type="success" size="least" title="修改" @click="handleUpdate(scope.row)">修改</el-button>
  53.         </template>
  54.       </el-table-column>
  55.     </el-table>
  56.    
  57.    
  58.     <el-dialog
  59.       v-cloak
  60.       title="维护"
  61.       :visible.sync="InputBaseInfoDialogData.dialogVisible"
  62.       :close-on-click-modal="InputBaseInfoDialogData.showCloseButton"
  63.       top="5vh"
  64.       :show-close="InputBaseInfoDialogData.showCloseButton"
  65.       :fullscreen="InputBaseInfoDialogData.dialogFullScreen"
  66.     >
  67.       
  68.       
  69.         
  70.           <h3>定时任务管理</h3>
  71.         
  72.         
  73.           <el-button type="text" title="全屏显示" @click="resizeInputBaseInfoDialogMax()"><i  /></el-button>
  74.           <el-button type="text" title="以弹出窗口形式显示" @click="resizeInputBaseInfoDialogNormal()"><i  /></el-button>
  75.           <el-button type="text" title="关闭" @click="closeInputBaseInfoDialog()"><i  /></el-button>
  76.         
  77.       
  78.       
  79.       
  80.       <el-form
  81.         ref="InputBaseInfoForm"
  82.         :status-icon="InputBaseInfoDialogData.statusIcon"
  83.         :model="InputBaseInfoDialogData.data"
  84.         
  85.       >
  86.         <el-form-item label="原任务名称" :label-width="InputBaseInfoDialogData.formLabelWidth" prop="jobName">
  87.           {{ InputBaseInfoDialogData.data.oldJobName }}【修改任务时使用】
  88.         </el-form-item>
  89.         <el-form-item label="原任务分组" :label-width="InputBaseInfoDialogData.formLabelWidth" prop="jobGroup">
  90.           {{ InputBaseInfoDialogData.data.oldJobGroup }}【修改任务时使用】
  91.         </el-form-item>
  92.         <el-form-item label="任务名称" :label-width="InputBaseInfoDialogData.formLabelWidth" prop="jobName">
  93.           <el-input v-model="InputBaseInfoDialogData.data.jobName" auto-complete="off" />
  94.         </el-form-item>
  95.         <el-form-item label="任务分组" :label-width="InputBaseInfoDialogData.formLabelWidth" prop="jobGroup">
  96.           <el-input v-model="InputBaseInfoDialogData.data.jobGroup" auto-complete="off" />
  97.         </el-form-item>
  98.         <el-form-item label="类名" :label-width="InputBaseInfoDialogData.formLabelWidth" prop="jobClassName">
  99.           <el-input v-model="InputBaseInfoDialogData.data.jobClassName" auto-complete="off" />
  100.         </el-form-item>
  101.         <el-form-item label="表达式" :label-width="InputBaseInfoDialogData.formLabelWidth" prop="cronExpression">
  102.           <el-input v-model="InputBaseInfoDialogData.data.cronExpression" auto-complete="off" />
  103.         </el-form-item>
  104.       </el-form>
  105.       
  106.       
  107.       
  108.         <el-button type="primary" @click="saveInputBaseInfoForm()">保 存</el-button>
  109.       
  110.       
  111.     </el-dialog>
  112.    
  113.    
  114.     <el-dialog
  115.       v-cloak
  116.       title="修改任务"
  117.       :visible.sync="ViewBaseInfoDialogData.dialogVisible"
  118.       :close-on-click-modal="ViewBaseInfoDialogData.showCloseButton"
  119.       top="5vh"
  120.       :show-close="ViewBaseInfoDialogData.showCloseButton"
  121.       :fullscreen="ViewBaseInfoDialogData.dialogFullScreen"
  122.     >
  123.       
  124.       
  125.         
  126.           <h3>修改任务</h3>
  127.         
  128.         
  129.           <el-button type="text" @click="dialogResize('ViewBaseInfoDialog',true)"><i  title="全屏显示" /></el-button>
  130.           <el-button type="text" @click="dialogResize('ViewBaseInfoDialog',false)"><i
  131.             
  132.             title="以弹出窗口形式显示"
  133.           /></el-button>
  134.           <el-button type="text" @click="dialogClose('ViewBaseInfoDialog')"><i  title="关闭" /></el-button>
  135.         
  136.       
  137.       
  138.       
  139.       <el-form
  140.         ref="ViewBaseInfoForm"
  141.         :status-icon="ViewBaseInfoDialogData.statusIcon"
  142.         :model="ViewBaseInfoDialogData.data"
  143.         
  144.       >
  145.         <el-form-item label="表达式" :label-width="ViewBaseInfoDialogData.formLabelWidth" prop="cronExpression">
  146.           {{ this.BaseTableData.currentRow.cronExpression }}
  147.         </el-form-item>
  148.       </el-form>
  149.       
  150.     </el-dialog>
  151.   
  152. </template>
复制代码
api定义

job.js定义访问后台接口的方式
  1. import request from '@/utils/request'
  2. //获取空任务
  3. export function getBlankJob() {
  4.   return request({
  5.     url: '/api/system/auth/job/blank',
  6.     method: 'get'
  7.   })
  8. }
  9. //获取任务列表(分页)
  10. export function fetchJobPage(data) {
  11.   return request({
  12.     url: '/api/system/auth/job/page',
  13.     method: 'post',
  14.     data
  15.   })
  16. }
  17. //获取用于修改的任务信息
  18. export function getUpdateObject(data) {
  19.   return request({
  20.     url: '/api/system/auth/job/dataforupdate',
  21.     method: 'post',
  22.     data
  23.   })
  24. }
  25. //保存任务
  26. export function saveJob(data) {
  27.   return request({
  28.     url: '/api/system/auth/job/save',
  29.     method: 'post',
  30.     data
  31.   })
  32. }
  33. //暂停任务
  34. export function pauseJob(data) {
  35.   return request({
  36.     url: '/api/system/auth/job/pause',
  37.     method: 'post',
  38.     data
  39.   })
  40. }
  41. //恢复任务
  42. export function resumeJob(data) {
  43.   return request({
  44.     url: '/api/system/auth/job/resume',
  45.     method: 'post',
  46.     data
  47.   })
  48. }
  49. //删除任务
  50. export function deleteJob(data) {
  51.   return request({
  52.     url: '/api/system/auth/job/delete',
  53.     method: 'post',
  54.     data
  55.   })
  56. }
复制代码
后端整合

配置类

单独数据源配置

Quartz会自动创建11张数据表,数据源可以与系统主数据源相同,也可以独立设置。

笔者建议单独设置Quartz数据源。在配置文件 application.yml 添加以下内容
  1. base2048:
  2.   job:
  3.     enable: true
  4.     datasource:
  5.       driver-class-name: com.mysql.cj.jdbc.Driver
  6.       url: jdbc:mysql://localhost:3306/base2048job?useSSL=false&serverTimezone=UTC&autoReconnect=true&allowPublicKeyRetrieval=true&useOldAliasMetadataBehavior=true
  7.       username: root
  8.       password: mysql
复制代码
数据源配置类如下:
  1. @Configuration
  2. public class QuartzDataSourceConfig {
  3.     @Primary
  4.     @Bean(name = "defaultDataSource")
  5.     @ConfigurationProperties(prefix = "spring.datasource")
  6.     public DruidDataSource druidDataSource() {
  7.         return new DruidDataSource();
  8.     }
  9.     @Bean(name = "quartzDataSource")
  10.     @QuartzDataSource
  11.     @ConfigurationProperties(prefix = "base2048.job.datasource")
  12.     public DruidDataSource quartzDataSource() {
  13.         return new DruidDataSource();
  14.     }
  15. }
复制代码
调度器配置

在 resources 下添加 quartz.properties 文件,内容如下:
  1. # 固定前缀org.quartz
  2. # 主要分为scheduler、threadPool、jobStore、plugin等部分
  3. #
  4. #
  5. org.quartz.scheduler.instanceName = DefaultQuartzScheduler
  6. org.quartz.scheduler.rmi.export = false
  7. org.quartz.scheduler.rmi.proxy = false
  8. org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
  9. org.quartz.scheduler.instanceId = 'AUTO'
  10. # 实例化ThreadPool时,使用的线程类为SimpleThreadPool
  11. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
  12. # threadCount和threadPriority将以setter的形式注入ThreadPool实例
  13. # 并发个数
  14. org.quartz.threadPool.threadCount = 15
  15. # 优先级
  16. org.quartz.threadPool.threadPriority = 5
  17. org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
  18. org.quartz.jobStore.misfireThreshold = 5000
  19. # 默认存储在内存中
  20. #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
  21. #持久化
  22. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
  23. org.quartz.jobStore.tablePrefix = QRTZ_
  24. org.quartz.jobStore.dataSource = qzDS
  25. org.quartz.dataSource.qzDS.maxConnections = 10
复制代码
调度器配置类内容如下:
  1. @Configuration
  2. public class SchedulerConfig {
  3.     @Autowired
  4.     private MyJobFactory myJobFactory;
  5.     @Value("${base2048.job.enable:false}")
  6.     private Boolean JOB_LOCAL_RUNING;
  7.     @Value("${base2048.job.datasource.driver-class-name}")
  8.     private String dsDriver;
  9.     @Value("${base2048.job.datasource.url}")
  10.     private String dsUrl;
  11.     @Value("${base2048.job.datasource.username}")
  12.     private String dsUser;
  13.     @Value("${base2048.job.datasource.password}")
  14.     private String dsPassword;
  15.     @Bean
  16.     public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
  17.         SchedulerFactoryBean factory = new SchedulerFactoryBean();
  18.         factory.setOverwriteExistingJobs(true);
  19.         // 延时启动
  20.         factory.setStartupDelay(20);
  21.         // 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
  22.         // factory.setOverwriteExistingJobs(true);
  23.         // 加载quartz数据源配置
  24.         factory.setQuartzProperties(quartzProperties());
  25.         // 自定义Job Factory,用于Spring注入
  26.         factory.setJobFactory(myJobFactory);
  27.         // 在com.neusoft.jn.gpbase.quartz.job.BaseJobTemplate 同样出现该配置
  28.         //原因 : qrtz 在集群模式下 存在 同一个任务 一个在A服务器任务被分配出去 另一个B服务器任务不再分配的情况.
  29.         //
  30.         if(!JOB_LOCAL_RUNING){
  31.             // 设置调度器自动运行
  32.             factory.setAutoStartup(false);
  33.         }
  34.         return factory;
  35.     }
  36.     @Bean
  37.     public Properties quartzProperties() throws IOException {
  38.         PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
  39.         propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
  40.         propertiesFactoryBean.afterPropertiesSet();
  41.         Properties properties = propertiesFactoryBean.getObject();
  42.         properties.setProperty("org.quartz.dataSource.qzDS.driver",dsDriver);
  43.         properties.setProperty("org.quartz.dataSource.qzDS.URL",dsUrl);
  44.         properties.setProperty("org.quartz.dataSource.qzDS.user",dsUser);
  45.         properties.setProperty("org.quartz.dataSource.qzDS.password",dsPassword);
  46.         return properties;
  47.     }
  48.     /*
  49.      * 通过SchedulerFactoryBean获取Scheduler的实例
  50.      */
  51.     @Bean(name="scheduler")
  52.     public Scheduler scheduler() throws Exception {
  53.         return schedulerFactoryBean().getScheduler();
  54.     }
  55. }
复制代码
任务模板

Job基类
  1. public abstract class BaseJob implements Job, Serializable {
  2.     private static final String JOB_MAP_KEY = "self";
  3.     public static final String STATUS_RUNNING = "1";
  4.     public static final String STATUS_NOT_RUNNING = "0";
  5.     public static final String CONCURRENT_IS = "1";
  6.     public static final String CONCURRENT_NOT = "0";
  7.     /**
  8.      * 任务名称
  9.      */
  10.     private String jobName;
  11.     /**
  12.      * 任务分组
  13.      */
  14.     private String jobGroup;
  15.     /**
  16.      * 任务状态 是否启动任务
  17.      */
  18.     private String jobStatus;
  19.     /**
  20.      * cron表达式
  21.      */
  22.     private String cronExpression;
  23.     /**
  24.      * 描述
  25.      */
  26.     private String description;
  27.     /**
  28.      * 任务执行时调用哪个类的方法 包名+类名
  29.      */
  30.     private Class beanClass = this.getClass();
  31.     /**
  32.      * 任务是否有状态
  33.      */
  34.     private String isConcurrent;
  35.     /**
  36.      * Spring bean
  37.      */
  38.     private String springBean;
  39.     /**
  40.      * 任务调用的方法名
  41.      */
  42.     private String methodName;
  43.     /**
  44.      * 为了将执行后的任务持久化到数据库中
  45.      */
  46.     @JsonIgnore
  47.     private JobDataMap dataMap = new JobDataMap();
  48.     public JobKey getJobKey(){
  49.         return JobKey.jobKey(jobName, jobGroup);// 任务名称和组构成任务key
  50.     }
  51.     public JobDataMap getDataMap(){
  52.         if(dataMap.size() == 0){
  53.             dataMap.put(JOB_MAP_KEY,this);
  54.         }
  55.         return dataMap;
  56.     }
  57.     public String getJobName() {
  58.         return jobName;
  59.     }
  60.     public void setJobName(String jobName) {
  61.         this.jobName = jobName;
  62.     }
  63.     public String getJobGroup() {
  64.         return jobGroup;
  65.     }
  66.     public void setJobGroup(String jobGroup) {
  67.         this.jobGroup = jobGroup;
  68.     }
  69.     public String getJobStatus() {
  70.         return jobStatus;
  71.     }
  72.     public void setJobStatus(String jobStatus) {
  73.         this.jobStatus = jobStatus;
  74.     }
  75.     public String getCronExpression() {
  76.         return cronExpression;
  77.     }
  78.     public void setCronExpression(String cronExpression) {
  79.         this.cronExpression = cronExpression;
  80.     }
  81.     public String getDescription() {
  82.         return description;
  83.     }
  84.     public void setDescription(String description) {
  85.         this.description = description;
  86.     }
  87.     public Class getBeanClass() {
  88.         return beanClass;
  89.     }
  90.     public void setBeanClass(Class beanClass) {
  91.         this.beanClass = beanClass;
  92.     }
  93.     public String getIsConcurrent() {
  94.         return isConcurrent;
  95.     }
  96.     public void setIsConcurrent(String isConcurrent) {
  97.         this.isConcurrent = isConcurrent;
  98.     }
  99.     public String getSpringBean() {
  100.         return springBean;
  101.     }
  102.     public void setSpringBean(String springBean) {
  103.         this.springBean = springBean;
  104.     }
  105.     public String getMethodName() {
  106.         return methodName;
  107.     }
  108.     public void setMethodName(String methodName) {
  109.         this.methodName = methodName;
  110.     }
  111. }
复制代码
Job模板类
  1. @Slf4j
  2. public abstract class BaseJobTemplate extends BaseJob {
  3.     @Value("${base2048.job.enable:false}")
  4.     private Boolean JOB_LOCAL_RUNING;
  5.     @Override
  6.     public final void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  7.         if (JOB_LOCAL_RUNING) {
  8.             try {
  9.                 this.runing(jobExecutionContext);
  10.             } catch (Exception ex) {
  11.                 throw new JobExecutionException(ex);
  12.             }
  13.         } else {
  14.             log.info("配置参数不允许在本机执行定时任务");
  15.         }
  16.     }
  17.     public abstract void runing(JobExecutionContext jobExecutionContext);
  18. }
复制代码
Job示例类

业务Job从模板类继承。
  1. @Slf4j
  2. @Component
  3. @DisallowConcurrentExecution
  4. public class TestJob extends BaseJobTemplate {
  5.     @Override
  6.     public void runing(JobExecutionContext jobExecutionContext)  {
  7.         try {
  8.             log.info("测试任务开始:【{}】", Instant.now().atOffset(ZoneOffset.ofHours(8)));
  9.             System.out.println("============= 测试任务正在运行 =====================");
  10.             System.out.println("============= Test job is running ===============");
  11.             log.info("测试任务结束:【{}】", Instant.now().atOffset(ZoneOffset.ofHours(8)));
  12.         } catch (Exception ex) {
  13.             log.error("测试任务异常:【{}】", Instant.now().atOffset(ZoneOffset.ofHours(8)));
  14.             log.error(ex.getMessage(), ex);
  15.         }
  16.     }
  17. }
复制代码
管理功能

Controller
  1. @RestController
  2. @RequestMapping("/api/system/auth/job")
  3. @Slf4j
  4. public class QuartzJobController {
  5.     @Resource
  6.     private QuartzService quartzService;
  7.     @PostMapping("/save")
  8.     @ApiOperation(value = "保存添加或修改任务",notes = "保存添加或修改任务")
  9.     public ResultDTO addOrUpdate(@RequestBody JobUpdateDTO jobUpdateDTO) throws Exception {
  10.         if (StringUtils.isBlank(jobUpdateDTO.getOldJobName())) {
  11.             ResultDTO resultDTO = this.addSave(jobUpdateDTO);
  12.             return resultDTO;
  13.         } else {
  14.             /**
  15.              * 先删除后添加
  16.              */
  17.             JobDTO jobDTO = new JobDTO();
  18.             jobDTO.setJobName(jobUpdateDTO.getOldJobName());
  19.             jobDTO.setJobGroup(jobUpdateDTO.getOldJobGroup());
  20.             this.delete(jobDTO);
  21.             ResultDTO resultDTO = this.addSave(jobUpdateDTO);
  22.             return resultDTO;
  23.         }
  24.     }
  25.     private ResultDTO addSave(@RequestBody JobUpdateDTO jobUpdateDTO) throws Exception {
  26.         BaseJob job = (BaseJob) Class.forName(jobUpdateDTO.getJobClassName()).newInstance();
  27.         job.setJobName(jobUpdateDTO.getJobName());
  28.         job.setJobGroup(jobUpdateDTO.getJobGroup());
  29.         job.setDescription(jobUpdateDTO.getDescription());
  30.         job.setCronExpression(jobUpdateDTO.getCronExpression());
  31.         try {
  32.             quartzService.addJob(job);
  33.             return  ResultDTO.success();
  34.         }catch (Exception ex){
  35.             log.error(ex.getMessage(),ex);
  36.             return ResultDTO.failureCustom("保存添加任务时服务发生意外情况。");
  37.         }
  38.     }
  39.     @PostMapping("/page")
  40.     @ApiOperation(value = "查询任务",notes = "查询任务")
  41.     public ResultDTO getJobPage(@RequestBody BasePageQueryVO basePageQueryVO) {
  42.         try {
  43.             IPage<JobDTO> jobDtoPage = quartzService.queryJob(basePageQueryVO.getCurrentPage(),basePageQueryVO.getPageSize());
  44.             return  ResultDTO.success(jobDtoPage);
  45.         }catch (Exception ex){
  46.             log.error(ex.getMessage(),ex);
  47.             return ResultDTO.failureCustom("查询任务时服务发生意外情况。");
  48.         }
  49.     }
  50.     @PostMapping("/pause")
  51.     @ApiOperation(value = "暂停任务",notes = "暂停任务")
  52.     public ResultDTO pause(@RequestBody JobDTO jobDTO) {
  53.         try {
  54.             quartzService.pauseJob(jobDTO.getJobName(),jobDTO.getJobGroup());
  55.             return ResultDTO.success();
  56.         }catch (Exception ex){
  57.             log.error(ex.getMessage(),ex);
  58.             return ResultDTO.failureCustom("暂停任务时服务发生意外情况。");
  59.         }
  60.     }
  61.     @PostMapping("/resume")
  62.     @ApiOperation(value = "恢复任务",notes = "恢复任务")
  63.     public ResultDTO resume(@RequestBody JobDTO jobDTO) {
  64.         try {
  65.             quartzService.resumeJob(jobDTO.getJobName(),jobDTO.getJobGroup());
  66.             return ResultDTO.success();
  67.         }catch (Exception ex){
  68.             log.error(ex.getMessage(),ex);
  69.             return ResultDTO.failureCustom("恢复任务时服务发生意外情况。");
  70.         }
  71.     }
  72.     @PostMapping("/delete")
  73.     @ApiOperation(value = "删除任务",notes = "删除任务")
  74.     public ResultDTO delete(@RequestBody JobDTO jobDTO) {
  75.         try {
  76.             if(quartzService.deleteJob(jobDTO.getJobName(),jobDTO.getJobGroup())) {
  77.                 return ResultDTO.failureCustom("删除失败。");
  78.             }else{
  79.                 return ResultDTO.success();
  80.             }
  81.         }catch (Exception ex){
  82.             log.error(ex.getMessage(),ex);
  83.             return ResultDTO.failureCustom("删除任务时服务发生意外情况。");
  84.         }
  85.     }
  86.     @GetMapping("/blank")
  87.     public ResultDTO getBlankJobDTO(){
  88.         JobUpdateDTO jobUpdateDTO = new JobUpdateDTO();
  89.         jobUpdateDTO.setJobClassName("com.qiyuan.base2048.quartz.job.jobs.");
  90.         jobUpdateDTO.setCronExpression("*/9 * * * * ?");
  91.         return ResultDTO.success(jobUpdateDTO);
  92.     }
  93.     @PostMapping("/dataforupdate")
  94.     public ResultDTO getUpdateJobDTO(@RequestBody JobDTO jobDTO){
  95.         JobUpdateDTO jobUpdateDTO = JobDtoTransMapper.INSTANCE.map(jobDTO);
  96.         jobUpdateDTO.setOldJobName(jobDTO.getJobName());
  97.         jobUpdateDTO.setOldJobGroup(jobDTO.getJobGroup());
  98.         return ResultDTO.success(jobUpdateDTO);
  99.     }
  100. }
复制代码
JobDTO
  1. @Data
  2. public class JobDTO {
  3.     private String jobClassName;
  4.     private String jobName;
  5.     private String jobGroup;
  6.     private String description;
  7.     private String cronExpression;
  8.     private String triggerName;
  9.     private String triggerGroup;
  10.     private String timeZoneId;
  11.     private String triggerState;
  12.     private Date startTime;
  13.     private Date nextFireTime;
  14.     private Date previousFireTime;
  15. }
复制代码
JobUpdateDTO
  1. @Data
  2. public class JobUpdateDTO  extends JobDTO{
  3.     private String oldJobName;
  4.     private String oldJobGroup;
  5. }
复制代码
Service

[code]@Service@Slf4jpublic class QuartzServiceImpl implements QuartzService {    /**     * Scheduler代表一个调度容器,一个调度容器可以注册多个JobDetail和Trigger.当Trigger和JobDetail组合,就可以被Scheduler容器调度了     */    @Autowired    private Scheduler scheduler;    @Resource    private QrtzJobDetailsMapper qrtzJobDetailsMapper;    @Autowired    private SchedulerFactoryBean schedulerFactoryBean;    @Autowired    public QuartzServiceImpl(Scheduler scheduler){        this.scheduler = scheduler;    }    @Override    public IPage queryJob(int pageNum, int pageSize) throws Exception{        List jobList = null;        try {            Scheduler scheduler = schedulerFactoryBean.getScheduler();            GroupMatcher matcher = GroupMatcher.anyJobGroup();            Set jobKeys = scheduler.getJobKeys(matcher);            jobList = new ArrayList();            for (JobKey jobKey : jobKeys) {                List

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表