博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot2.x 定时任务
阅读量:5225 次
发布时间:2019-06-14

本文共 4309 字,大约阅读时间需要 14 分钟。

定时任务和常见定时任务区别

1、常见定时任务 Java自带的java.util.Timer类

timer:配置比较麻烦,时间延后问题
timertask:不推荐

2、Quartz框架

配置更简单
xml或者注解

3、SpringBoot使用注解方式开启定时任务

1)启动类里面 @EnableScheduling开启定时任务,自动扫描
2)定时任务业务类 加注解 @Component被容器扫描
3)定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期执行一次

 

先介绍第三种定时任务(spring):

 

1、cron 定时任务表达式 @Scheduled(cron="*/1 * * * * *") 表示每秒

1)cron工具 https://tool.lu/crontab/    或者 http://cron.qqe2.com/
2、fixedRate: 定时多久执行一次(上一次开始执行时间点后xx秒再次执行;)
3、fixedDelay: 上一次执行结束时间点后xx秒再次执行
4、fixedDelayString: 字符串形式,可以通过配置文件指定

 

下面上代码:

一、添加配置任务线程池,开启同步任务:

 

@Configurationpublic class ScheduleConfig implements SchedulingConfigurer {    /**     * 添加定时任务到线程池     * @param scheduledTaskRegistrar     */    @Override    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {        scheduledTaskRegistrar.setTaskScheduler(getScheduler());    }    /**     * 线程池配置类     * @return     */    @Bean(destroyMethod = "shutdown")    public ThreadPoolTaskScheduler getScheduler(){        ThreadPoolTaskScheduler taskScheduler=new ThreadPoolTaskScheduler();        taskScheduler.setPoolSize(100);        taskScheduler.setAwaitTerminationSeconds(60);        taskScheduler.setThreadNamePrefix("task-");        taskScheduler.setWaitForTasksToCompleteOnShutdown(true);        return taskScheduler;    }    /**     * 设置定时触发器     * @return     */    private Trigger getTrigger(String cron){        return new Trigger() {            @Override            public Date nextExecutionTime(TriggerContext triggerContext) {                CronTrigger trigger=new CronTrigger(cron);                return trigger.nextExecutionTime(triggerContext);            }        };    }}

 

二、建立任务执行类(实现逻辑):

 

 

public class DynamicTask1 implements Runnable{    @Override    public void run() {        System.out.print("定时任务1");    }}public class DynamicTask2 implements Runnable {    @Override    public void run() {        System.out.print("定时任务2");    }}

三、建立Controller,动态配置定时时间(mysql):

@RestController@RequestMapping(value = "api/")public class ScheduleController {    @Autowired    private ThreadPoolTaskScheduler threadPoolTaskScheduler;    @Autowired    private CronService cronService;    private ScheduledFuture
DynamicTask1Future; private ScheduledFuture
DynamicTask2Future; /** * 运行定时任务 * @return */ @GetMapping(value = "/sch1.do") public Object run1(){ //获取时间间隔 String cron=cronService.findByCode("task1").getCron(); //添加运行时间 DynamicTask1Future=threadPoolTaskScheduler.schedule(new DynamicTask1(),new CronTrigger(cron)); return new ReturnResult().Success(); } @GetMapping(value = "/sch2.do") public Object run2(){ //获取时间间隔 String cron=cronService.findByCode("task2").getCron(); //添加运行时间 DynamicTask2Future=threadPoolTaskScheduler.schedule(new DynamicTask2(),new CronTrigger(cron)); return new ReturnResult().Success(); } /** * 关闭定时任务 * @param future * @return */ @GetMapping(value = "/stop.do/{future}") public Object stop(@PathVariable("future") String future){ if(future.equals("DynamicTask1Future")) { if(DynamicTask1Future != null) { DynamicTask1Future.cancel(true); } } if(future.equals("DynamicTask2Future")) { if(DynamicTask2Future != null) { DynamicTask2Future.cancel(true); } } return new ReturnResult().Success(); } /** * 更改时间马上执行定时任务 * @param future * @return */ @GetMapping(value = "/update.do/{future}") public Object change(@PathVariable("future") String future){ String cron="0/8 * * * * ?"; stop(future); if(future.equals("DynamicTask1Future")) { cronService.updateById(cron,1); DynamicTask1Future = threadPoolTaskScheduler.schedule(new DynamicTask1(), new CronTrigger(cron)); } if(future.equals("DynamicTask2Future")) { cronService.updateById(cron,2); DynamicTask2Future = threadPoolTaskScheduler.schedule(new DynamicTask2(), new CronTrigger(cron)); } return new ReturnResult().Success(); } /** * 默认启动 */ @PostConstruct private void autoRun(){ run1(); }}

 四、结果,这里我配置任务1运行时间(8秒一次),任务2运行时间(1秒1次)

转载于:https://www.cnblogs.com/Mblood/p/9816152.html

你可能感兴趣的文章
SpringAop与AspectJ
查看>>
Leetcode 226: Invert Binary Tree
查看>>
http站点转https站点教程
查看>>
解决miner.start() 返回null
查看>>
关于MFC中窗口的销毁
查看>>
bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
查看>>
BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>
定制jackson的自定义序列化(null值的处理)
查看>>
auth模块
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>