当前位置:网站首页>【无标题】
【无标题】
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;
}
```
边栏推荐
- leetcode2312. Selling wood blocks (difficult, weekly race)
- The middle element and the rightmost element of the shutter
- LFM信号加噪、时频分析、滤波
- Leetcode face T10 (1-9) array, ByteDance interview sharing
- Infix expression to suffix expression (computer) code
- Sword finger offer 29 Print matrix clockwise
- 2022低压电工考试题模拟考试题库模拟考试平台操作
- Opencascade7.6 compilation
- golang---锁
- leetcode2309. The best English letters with both upper and lower case (simple, weekly)
猜你喜欢

leetcode2311. Longest binary subsequence less than or equal to K (medium, weekly)

【毕业季】研究生学长分享怎样让本科更有意义

LFM signal denoising, time-frequency analysis, filtering

golang---锁

How to batch add background and transition effects to videos?

【带你学c带你飞】3day第2章 用C语言编写程序(练习 2.3 计算分段函数)

A quick understanding of digital electricity

RTL8189FS如何关闭Debug信息

How to turn off the LED light of Rog motherboard
![[reading notes] programmer training manual - practical learning is the most effective (project driven)](/img/13/28116a74512895ad725dffed02f8bd.png)
[reading notes] programmer training manual - practical learning is the most effective (project driven)
随机推荐
Software testing learning notes - network knowledge
A quick understanding of digital electricity
Cesium dynamic diffusion point effect
Medical management system (C language course for freshmen)
2022 low voltage electrician test question simulation test question bank simulation test platform operation
Sword finger offer 62 The last remaining number in the circle
MySQL约束与多表查询实例分析
No programming code technology! Four step easy flower store applet
Pytest testing framework
LeetCode刷题(十)——顺序刷题46至50
What style of Bluetooth headset is easy to use? High quality Bluetooth headset ranking
Which is a good Bluetooth headset of about 300? 2022 high cost performance Bluetooth headset inventory
flutter 中間一個元素,最右邊一個元素
CSDN insertion directory in 1 second
LFM信号加噪、时频分析、滤波
How to batch add background and transition effects to videos?
leetcode2310. 个位数字为 K 的整数之和(中等,周赛)
es面試題
剑指 Offer 62. 圆圈中最后剩下的数字
Iterative unified writing method of binary tree