SpringBoot+Quartz实现动态定时任务

 更新时间:2022年09月02日 14:39:04   作者:你是我的小丫小太阳  
这篇文章主要为大家详细介绍了springBoot+Quartz实现动态定时任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了springBoot+Quartz实现动态定时任务的具体代码,供大家参考,具体内容如下

目前常用的几种任务调度

  • Timer,简单无门槛,一般也没人用。
  • spring @Scheduled注解,一般集成于项目中,小任务很方便。
  • 开源工具 Quartz,分布式集群开源工具,以下两个分布式任务应该都是基于Quartz实现的,可以说是中小型公司必选,当然也视自身需求而定。
  • 分布式任务 XXL-JOB,是一个轻量级分布式任务调度框架,支持通过 Web 页面对任务进行 CRUD 操作,支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,支持在线配置调度任务入参和在线查看调度结果。
  • 分布式任务 Elastic-Job,是一个分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。支持分布式调度协调、弹性扩容缩容、失效转移、错过执行作业重触发、并行调度、自诊。
  • 分布式任务 Saturn,Saturn是唯品会在github开源的一款分布式任务调度产品。它是基于当当elastic-job来开发的,其上完善了一些功能和添加了一些新的feature。目前在github上开源大半年,470个star。Saturn的任务可以用多种语言开发比如python、Go、Shell、Java、Php。其在唯品会内部已经发部署350+个节点,每天任务调度4000多万次。同时,管理和统计也是它的亮点。

SpringBoot项目的实现方法

1.config配置

import org.quartz.Scheduler;
import org.quartz.ee.servlet.QuartzInitializerListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 
import java.io.IOException;
import java.util.Properties;
 
/**
 * quartz配置
 */
@Configuration
public class SchedulerConfig {
    
    @Bean(name="SchedulerFactory")
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setAutoStartup(true);
        //factory.setStartupDelay(5);//延时5秒启动
        return factory;
    }
 
    /*
     * quartz初始化监听器
     */
    @Bean
    public QuartzInitializerListener executorListener() {
       return new QuartzInitializerListener();
    }
 
    /*
     * 通过SchedulerFactoryBean获取Scheduler的实例
     */
    @Bean(name="Scheduler")
    public Scheduler scheduler() throws IOException {
        return schedulerFactoryBean().getScheduler();
    }
 
}

2.实现方法

/**
     * 新建任务
     * **/
    @ApiOperation(value = "Test-add", notes = "Test-add")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "cruiseId", value = "巡航线id", required = true, paramType = "path"),
            @ApiImplicitParam(name = "jobName", value = "任务名称", required = true, paramType = "query"),
            @ApiImplicitParam(name = "jobGroup", value = "任务分组", required = true, paramType = "query"),
            @ApiImplicitParam(name = "executeDate", value = "当前时间[yyyy-MM-dd HH:mm:ss]", required = true, paramType = "query", dataType = "Date")})
    @PutMapping("/test/add/{cruiseId}")
    public ResultBody test(@PathVariable("cruiseId") String cruiseId,@RequestParam("jobName") String jobName,@RequestParam("jobGroup") String jobGroup,
                           @RequestParam(value = "executeDate")@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date executeDate) {
        try {
            SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //构建job信息
            JobDetail job = JobBuilder.newJob(CruisePlanJob.class).withIdentity(jobName, jobGroup)
                            .withDescription("巡航计划").build();
            JobDataMap jobDataMap = job.getJobDataMap();
            jobDataMap.put("cruiseId", cruiseId);
            //CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("cron的表达式");
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger" + jobName, jobGroup)
                    .startAt(executeDate)
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(0))
                    .build();
            //SimpleScheduleBuilder.simpleSchedule().withRepeatCount(0).withIntervalInSeconds(20)//每隔多少秒执行一次; withRepeatCount 设置重复的次数
            //.startNow().withSchedule(cronScheduleBuilder)
            //交由Scheduler安排触发
            scheduler.scheduleJob(job, trigger);
            System.out.println("startJob:"+JobKey.jobKey(jobName));
        } catch (Exception e) {
            e.printStackTrace();
            return ResultBody.failed();
        }
        return ResultBody.ok();
    }
 
    /**
     * 删除任务
     * **/
    @ApiOperation(value = "Test-remove", notes = "Test-remove")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "jobName", value = "任务名称", required = true, paramType = "query"),
            @ApiImplicitParam(name = "jobGroup", value = "任务分组", required = true, paramType = "query")})
    @GetMapping("/test/remove")
    public ResultBody remove(@RequestParam("jobName") String jobName,@RequestParam("jobGroup") String jobGroup) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
            // 停止触发器
            scheduler.pauseTrigger(triggerKey);
            // 移除触发器
            scheduler.unscheduleJob(triggerKey);
            // 删除任务
            boolean result = scheduler.deleteJob(JobKey.jobKey(jobName, jobGroup));
            System.out.println(result);
            System.out.println("removeJob:"+JobKey.jobKey(jobName));
        } catch (Exception e) {
            e.printStackTrace();
            return ResultBody.failed();
        }
        return ResultBody.ok();
    }

3.CruisePlanJob类实现具体逻辑

@Slf4j
public class CruisePlanJob implements Job {
 
  @Override
  public void execute(JobExecutionContext context) {
    try{
      JobDataMap jdMap = context.getJobDetail().getJobDataMap();
      String cruiseId = (String) jdMap.get("cruiseId");
      String panId = (String) jdMap.get("panId");
      String userId = (String) jdMap.get("userId");
      String appId = (String) jdMap.get("appId");
      //TODO 逻辑待补充
 
      log.info("cruisePlan-CruisePlanJob-计划执行开始===>panId:{}---cruiseId:{}---appId:{}---userId:{}---resultBody:{}", panId, cruiseId,  appId,  userId, resultBody);
    }catch (Exception e){
      e.printStackTrace();
    }
  }
 
}

4.另外两种任务的方法

//恢复任务  
scheduler.resumeJob(key);
//停止任务
scheduler.pauseJob(key);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java可变参数的应用小结

    Java可变参数的应用小结

    这篇文章主要介绍了Java可变参数的应用小结,实现同一个函数名,不同参数个数,实现的方法相同,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10
  • Java教程package和import访问控制的步骤详解

    Java教程package和import访问控制的步骤详解

    这篇文章主要为大家介绍了Java教程package和import访问控制的步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 喜大普奔IntelliJ IDEA 可以使用中文了

    喜大普奔IntelliJ IDEA 可以使用中文了

    IntelliJ Idea最大的亮点开始支持中文,很多英语不好的童鞋有福了,今天通过本文给大家分享如何开启中文汉化,通过图文步骤给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-05-05
  • 单例模式的反射漏洞和反序列化漏洞代码实例

    单例模式的反射漏洞和反序列化漏洞代码实例

    这篇文章主要介绍了单例模式的反射漏洞和反序列化漏洞,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • JavaSE系列基础包装类及日历类详解

    JavaSE系列基础包装类及日历类详解

    这篇文章主要介绍的是JavaSE中常用的基础包装类以及日历类的使用详解,文中的示例代码简洁易懂,对我们学习JavaSE有一定的帮助,感兴趣的小伙伴快来跟随小编一起学习吧
    2021-12-12
  • Mybatis中BindingException异常的产生原因及解决过程

    Mybatis中BindingException异常的产生原因及解决过程

    BindingException异常是MyBatis框架中自定义的异常,顾名思义指的是绑定出现问题,下面这篇文章主要给大家介绍了关于MyBatis报错BindingException异常的产生原因及解决过程,需要的朋友可以参考下
    2023-06-06
  • SpringBoot整合Mybatis Plus多数据源的实现示例

    SpringBoot整合Mybatis Plus多数据源的实现示例

    本文主要介绍了SpringBoot整合Mybatis Plus多数据源的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • java调用FFmpeg实现视屏压缩功能的详细步骤

    java调用FFmpeg实现视屏压缩功能的详细步骤

    这篇文章主要介绍了java调用FFmpeg实现视屏压缩功能,本文简单的展示了java调用FFmpeg命令实现视屏的压缩的详细步骤,需要的朋友可以参考下
    2021-09-09
  • feign客户端HTTP状态码为204时 响应体被忽略的问题

    feign客户端HTTP状态码为204时 响应体被忽略的问题

    这篇文章主要介绍了feign客户端HTTP状态码为204时 响应体被忽略的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 详细谈谈Java中long和double的原子性

    详细谈谈Java中long和double的原子性

    原子性是指一个操作或多个操作要么全部执行,且执行的过程不会被任何因素打断,要么就都不执行,下面这篇文章主要给大家介绍了关于Java中long和double原子性的相关资料,需要的朋友可以参考下
    2021-08-08

最新评论