springboot 动态修改定时任务
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 动态修改定时任务的更多相关文章
- springboot动态修改日志级别+权限认证
1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ...
- quartz2.2.1-测试02-通过servlet动态修改定时任务运行时间
/* * To change this license header, choose License Headers in Project Properties. * To change this t ...
- SpringBoot 定时任务升级篇(动态修改cron参数)
需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态修改cron参数呢?那么我们一起看看具体怎么实现,先看下本节大纲: ()简单方式:修改 ...
- Spring Boot 系列教程14-动态修改定时任务cron参数
动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值 不能使用@Scheduled(cron = "${jobs.cron}")实现 DynamicSch ...
- SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一.在JAVA开发领域,目前可以通过以下 ...
- springboot整合Quartz实现动态配置定时任务
前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 & ...
- Springboot自带定时任务实现动态配置Cron参数
同学们,我今天分享一下SpringBoot动态配置Cron参数.场景是这样子的:后台管理界面对定时任务进行管理,可动态修改执行时间,然后保存入库,每次任务执行前从库里查询时间,以达到动态修改Cron参 ...
- Springboot定时任务原理及如何动态创建定时任务
一.前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝.分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件.因为是多省份,服务器.文件名规则.数据规则都不一定,所以要做 ...
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...
随机推荐
- qt .pro文件和cmakelists.txt配置第三方库
.pro文件引用第三方库文件和头文件路径 1.库文件(LIBS添加的是共享库文件,-L添加目录,-l指定共享库名称) LIBS += -L/usr/local/lib -lmath LIBS的使用就是 ...
- 记一次Celery的仇
背景:项目在公司的一台虚拟机上运行(32核+32G).其他人的项目也在这台物理机上运行..我的训练代码是单进程的,跑完一次需要大约10h(数据量大逮着一个核使劲跑..):训练是一个Celery定时任务 ...
- Request中getContextPath、getServletPath、getRequestURI、request.getRealPath的区别
1 区别 假定你的web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 1.1 System.o ...
- Flask学习之八 关注、联系人和好友
英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-viii-followers-contacts-and- ...
- Hbase数据模型 行
- Spark Steaming消费kafka数据条数变少问题
对于基于Receiver 形式,我们可以通过配置 spark.streaming.receiver.maxRate 参数来限制每个 receiver 每秒最大可以接收的记录的数据:对于 Direct ...
- Tyvj-1338 QQ农场
P1338 QQ农场 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Sandytea前段时间沉迷于QQ农场中……一天夜里,他梦见来到好友X的农场上…… 描述 ...
- 2019-8-31-PowerShell-通过-WMI-获取系统信息
title author date CreateTime categories PowerShell 通过 WMI 获取系统信息 lindexi 2019-08-31 16:55:58 +0800 2 ...
- 给radio添加点击事件
1.单独给每个radio添加点击事件 <fieldset id="form-gra-time"> <legend>请选择日期粒度:</legend&g ...
- [C#] 汉字转拼音,支持多音字
这份代码大概不是严格意义上正确的,但是一般场景用用应该没问题. using System; using System.Collections.Generic; using System.Linq; u ...