当前位置:网站首页>【无标题】
【无标题】
2022-07-02 02:24:00 【热爱Java的编程小白】
### 定时任务:
使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:
- 一、基于注解(@Scheduled)
- 二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。
- 三、基于注解设定多线程定时任务
#### 1.静态,基于注解:
```Java
@Configuration //标志为配置类
@EnableScheduling //开启定时任务
public class SaticScheduleTask {
//3.添加定时任务
@Scheduled(cron = "0/5 * * * * ?")
//@Scheduled(fixedRate=5000)
private void configureTasks(){
System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
}
}
```
#### 2.静态,基于代码(开启和关闭):
配置类:
```Java
package com.example.timedtask.test2.config;
import com.example.timedtask.TimedTaskApplication;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import java.util.concurrent.ScheduledFuture;
/**
* @Author: LiDaHu
* @Date: 2022/2/21 12:12
* @Description:
*/
@Component
@Scope("prototype")
public class DynamicTask {
private final static Logger logger = LoggerFactory.getLogger(DynamicTask.class);
private String cron;
public String name;
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;//线程池任务调度程序
private ScheduledFuture future;
public String startCron() {
cron = "0/5 * * * * ?";
System.out.println(Thread.currentThread().getName());
name = Thread.currentThread().getName();
future = threadPoolTaskScheduler.schedule(new myTask(name), new CronTrigger(cron));
TimedTaskApplication.map.put(name, future);
return "定时任务开启";
}
public String stop() {
if (future != null) {
future.cancel(true);
}
return "定时任务关闭";
}
private class myTask implements Runnable {
private String name;
myTask(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("test" + name);
...
//此处可以写等待定时任务到期所要执行的业务逻辑
}
}
}
```
Controller控制层:
```Java
@RestController
public class TimedController {
@Autowired
private DynamicTask task;
@RequestMapping("/task")
public String test() throws Exception {
// 开启定时任务,对象注解Scope是多利的。
String s = task.startCron();
System.out.println("定时任务开启");
return s;
}
@RequestMapping("/stop")
public String stop() throws Exception {
//关闭定时任务
String stop = task.stop();
System.out.println("定时任务停止");
return stop;
}
}
```
启动类:
```Java
@SpringBootApplication
public class TimedTaskApplication {
@Autowired
private static DynamicTask task;
// 线程存储器
public static ConcurrentHashMap<String, ScheduledFuture> map = new ConcurrentHashMap<String, ScheduledFuture>();
// 启动入口
public static void main(String[] args) {
SpringApplication.run(TimedTaskApplication.class, args);
}
// 创建线程
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
executor.setPoolSize(20);
executor.setThreadNamePrefix("taskExecutor-"); //设置线程名称前缀
executor.setWaitForTasksToCompleteOnShutdown(true); //设置等待任务在关机时完成
executor.setAwaitTerminationSeconds(60); //设置等待终止秒
return executor;
}
```
边栏推荐
- Pat a-1165 block reversing (25 points)
- An analysis of circuit for quick understanding
- * and & symbols in C language
- A quick understanding of analog electricity
- CSDN insertion directory in 1 second
- CVPR 2022 | Dalian Institute of technology proposes a self calibration lighting framework for low light level image enhancement of real scenes
- Opengauss database backup and recovery guide
- es面试题
- Sword finger offer 42 Maximum sum of continuous subarrays
- Sword finger offer 31 Stack push in and pop-up sequence
猜你喜欢

golang---锁

As a software testing engineer, will you choose the bank post? Laolao bank test post

AR增强现实可应用的场景
![[liuyubobobo play with leetcode algorithm interview] [00] Course Overview](/img/1c/c8cab92c74b6658c3ef608c5255f1f.png)
[liuyubobobo play with leetcode algorithm interview] [00] Course Overview

RTL8189FS如何关闭Debug信息

How to execute an SQL in MySQL

Which is a good Bluetooth headset of about 300? 2022 high cost performance Bluetooth headset inventory

MySQL主从延迟问题怎么解决

leetcode2310. The one digit number is the sum of integers of K (medium, weekly)

OpenCASCADE7.6编译
随机推荐
[question] - why is optical flow not good for static scenes
【读书笔记】程序员修炼手册—实战式学习最有效(项目驱动)
Cesium dynamic diffusion point effect
leetcode373. 查找和最小的 K 对数字(中等)
STM32F103 - two circuit PWM control motor
[reading notes] programmer training manual - practical learning is the most effective (project driven)
Medical management system (C language course for freshmen)
Sword finger offer 42 Maximum sum of continuous subarrays
DNS domain name resolution
Pytest testing framework
Sword finger offer 47 Maximum value of gifts
Sword finger offer 31 Stack push in and pop-up sequence
Software development life cycle -- waterfall model
RTL8189FS如何关闭Debug信息
MySQL中一条SQL是怎么执行的
Sword finger offer 29 Print matrix clockwise
The basic steps of using information theory to deal with scientific problems are
剑指 Offer II 031. 最近最少使用缓存
CVPR 2022 | 大连理工提出自校准照明框架,用于现实场景的微光图像增强
Which kind of sports headphones is easier to use? The most recommended sports headphones