1、静态定时

1)启动类加上注解@EnableScheduling

@EnableAsync
@EnableScheduling
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
@ComponentScan("com.example")
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} @Autowired
private Environment env;
//destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用.
//@Bean(destroyMethod = "close")
public DataSource dataSource() {
//
} //为了打包springboot项目
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {
return builder.sources(this.getClass());
}
}

2) 定时类加上@Component、定时方法添加@Scheduled(cron = "")即可  这里有一个在线生成cron的网站

@Component
public class ScheduledTask {
protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Scheduled(cron = "0 30 * * * ?")
@Async("asyncServiceExecutor")
public void AutoGetAllData(){
//
}
}

这里默认的定时任务是单线程的,如果有多个任务同时触发,只能一个一个执行,如果想实现多线程,可以自行建立线程池工具类,再通过@Async()引用即可

线程池工具类

@Configuration
@EnableAsync
public class ExecutorConfig { private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class); @Bean
public Executor asyncServiceExecutor(){
logger.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(5);
//配置最大线程数
executor.setMaxPoolSize(5);
//配置队列大小
executor.setQueueCapacity(99999);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-service-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}

2、动态定时

动态定时是通过继承SchedulingConfigurer,重写configureTasks方法实现的。

实现过程:

1、前台修改定时任务,更新数据库

2、定时器根据ID或者名称查询数据库中该方法的cron,注意修改之后不会立即实现,需等当前任务完成之后,下一次执行。这里有更详细的博客

@Component
public class MyDynamicTask implements SchedulingConfigurer { @Autowired
private TaskService taskService;
private static Logger log = LoggerFactory.getLogger(MyDynamicTask.class);
private String cron = "0/10 * * * * ? "; @Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar){
if(getTrigger("InsertCaiYanShiJian")!=null){
scheduledTaskRegistrar.addTriggerTask(InsertCaiYanShiJian(), getTrigger("InsertCaiYanShiJian"));
}
if(getTrigger("AutoGetAllData")!=null){
scheduledTaskRegistrar.addTriggerTask(AutoGetAllData(), getTrigger("AutoGetAllData"));
}
} //定时任务1
private Runnable InsertCaiYanShiJian(){
return new Runnable() {
        //注入Dao
@Autowired
private OrigDLDao origDLDao;
@Autowired
private OrigRtvDao origRtvDao;
@Override
public void run() {
log.info("InsertCaiYanShiJian 每33秒执行一次,时间为:" + new Date(System.currentTimeMillis()));
          //注入失败,通过工具类注入  
if(origDLDao==null){
this.origDLDao = SpringBeanFactoryUtils.getBean(OrigDLDao.class);
}
if(origRtvDao==null){
this.origRtvDao = SpringBeanFactoryUtils.getBean(OrigRtvDao.class);
}
//具体逻辑
}
};
}     //定时任务2
private Runnable AutoGetAllData(){
return new Runnable(){
@Autowired
private UtilDao utilDao;
@Autowired
private Client client;
@Override
public void run() {
// 业务逻辑
log.info("AutoGetAllData 每十秒执行一次,时间为:" + new Date(System.currentTimeMillis()));
if(utilDao==null){
this.utilDao = SpringBeanFactoryUtils.getBean(UtilDao.class);
}
if(client==null){
this.client = SpringBeanFactoryUtils.getBean(Client.class);
}
//具体逻辑
}
};
}

    
private Trigger getTrigger(String taskName){
return new Trigger(){
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// 触发器
if(getCron(taskName)==""){
return null;
}else {
CronTrigger trigger = new CronTrigger(getCron(taskName));
return trigger.nextExecutionTime(triggerContext);
}
}
};
}
//通过任务名称获取Task,Task是一个对象,有任务ID,任务名称,任务描述,cron等
public String getCron(String taskName) {
Task task = this.taskService.getTaskByName(taskName);
if(task==null){
return "";
}else {
return task.getTaskCron();
}
}
}
SpringBeanFactoryUtils工具类
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component; @Component
public class SpringBeanFactoryUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/**
* 获取静态变量中的ApplicationContext.
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
//System.out.println(name);
String[] str = applicationContext.getBeanDefinitionNames();
for (String string : str) {
System.out.println("..." + string);
}
return (T) applicationContext.getBean(name);
}
/**
* 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.
*/
public static <T> T getBean(Class<T> requiredType) {
return applicationContext.getBean(requiredType);
}
/**
* 实现ApplicationContextAware接口, 注入Context到静态变量中.
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}

springboot 动态修改定时任务的更多相关文章

  1. springboot动态修改日志级别+权限认证

    1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ...

  2. quartz2.2.1-测试02-通过servlet动态修改定时任务运行时间

    /* * To change this license header, choose License Headers in Project Properties. * To change this t ...

  3. SpringBoot 定时任务升级篇(动态修改cron参数)

    需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态修改cron参数呢?那么我们一起看看具体怎么实现,先看下本节大纲: ()简单方式:修改 ...

  4. Spring Boot 系列教程14-动态修改定时任务cron参数

    动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值 不能使用@Scheduled(cron = "${jobs.cron}")实现 DynamicSch ...

  5. SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一.在JAVA开发领域,目前可以通过以下 ...

  6. springboot整合Quartz实现动态配置定时任务

    前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 & ...

  7. Springboot自带定时任务实现动态配置Cron参数

    同学们,我今天分享一下SpringBoot动态配置Cron参数.场景是这样子的:后台管理界面对定时任务进行管理,可动态修改执行时间,然后保存入库,每次任务执行前从库里查询时间,以达到动态修改Cron参 ...

  8. Springboot定时任务原理及如何动态创建定时任务

    一.前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝.分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件.因为是多省份,服务器.文件名规则.数据规则都不一定,所以要做 ...

  9. SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...

随机推荐

  1. UVA_445:Marvelous Mazes

    Language:C++ 4.8.2 #include<stdio.h> #include<string.h> #include<ctype.h> int main ...

  2. 强制去除xcode的编译警告

    使用 #pragma clang diagnostic ignored 语法来强制去除xcode的编译警告,代码举例如下: #pragma clang diagnostic push #pragma ...

  3. Spring集成Hessian1

    Hessian是一个轻量级的远程调用工具,采用的是Binary RPC协议,很适合于发送二进制数据,基于HTTP具有防火墙穿透能力.Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们 ...

  4. Java练习 SDUT-2746_大小写转换

    大小写转换 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description X现在要学习英文以及各种稀奇古怪的字符的了.现在他想把一串字 ...

  5. oracle函数 TRIM(c1 from c2)

    [功能]删除左边和右边出现的字符串 [参数]C2 删除前字符串 c1 删除字符串,默认为空格 [返回]字符型 [示例] select TRIM('X' from 'XXXgao qian jingXX ...

  6. 同一个C语言工程不同C文件之间的函数互相调用问题

    定义一个function.h文件来声明这些函数: //#ifndef __FUNCTION_H__//#define __FUNCTION_H__   int fun(int,int);   int ...

  7. oracle避免使用耗费资源的操作

    带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需 ...

  8. 本地测试读取redis和普通文件缓存的速度,redis慢一倍?

    重新测试了,换成了Linux服务器,php5.6,512内存.连续读取1千次不同的文件(每个文件41KB),redis也是1千个不同的key,文件缓存还是比redis快! 但是,但是,后来我换成连续读 ...

  9. 你以为SSL是安全的吗?

    在现代的IT安全领域,很大程度上依赖SSL来保障通讯安全.但SSL是安全的吗? 在2005年,王小云证明SHA-1能在较短的时间内找到碰撞.王小云发现SHA-1的安全弱点是偶然还是必然? 就我所知,各 ...

  10. 【codeforces 764C】Timofey and a tree

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...