springboot 动态修改定时任务

摘要:
实现过程:1、前台修改定时任务,更新数据库2、定时器根据ID或者名称查询数据库中该方法的cron,注意修改之后不会立即实现,需等当前任务完成之后,下一次执行。这里有更详细的博客@ComponentpublicclassMyDynamicTaskimplementsSchedulingConfigurer{@AutowiredprivateTaskServicetaskService;privatestaticLoggerlog=LoggerFactory.getLogger;privateStringcron="0/10****?
1、静态定时

1)启动类加上注解@EnableScheduling

@EnableAsync
@EnableScheduling
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
@ComponentScan("com.example")
public classDemoApplication {

    public static voidmain(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Autowired
    privateEnvironment env;
    //destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用.
    //@Bean(destroyMethod =  "close")
    publicDataSource dataSource() {
        //}

    //为了打包springboot项目
    protectedSpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
        return builder.sources(this.getClass());
    }
}

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

@Component
public classScheduledTask {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());

   @Scheduled(cron = "0 30 * * * ?")
    @Async("asyncServiceExecutor")
    public voidAutoGetAllData(){
        //}
}

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

线程池工具类

@Configuration
@EnableAsync
public classExecutorConfig {

    private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);

    @Bean
    publicExecutor asyncServiceExecutor(){
        logger.info("start asyncServiceExecutor");
        ThreadPoolTaskExecutor executor = newThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(5);
        //配置最大线程数
        executor.setMaxPoolSize(5);
        //配置队列大小
        executor.setQueueCapacity(99999);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-");
        //rejection-policy:当pool已经达到max size的时候,如何处理新任务
        //CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
executor.initialize();
        returnexecutor;
    }
}
2、动态定时

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

实现过程:

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

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

@Component
public class MyDynamicTask implementsSchedulingConfigurer {

    @Autowired
    privateTaskService taskService;
    private static Logger log = LoggerFactory.getLogger(MyDynamicTask.class);
    private String cron = "0/10 * * * * ? ";

    @Override
    public voidconfigureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar){
        if(getTrigger("InsertCaiYanShiJian")!=null){
            scheduledTaskRegistrar.addTriggerTask(InsertCaiYanShiJian(), getTrigger("InsertCaiYanShiJian"));
        }
        if(getTrigger("AutoGetAllData")!=null){
           scheduledTaskRegistrar.addTriggerTask(AutoGetAllData(), getTrigger("AutoGetAllData"));
       }}

    //定时任务1
    privateRunnable InsertCaiYanShiJian(){
        return newRunnable() {
//注入Dao @Autowired
privateOrigDLDao origDLDao; @Autowired privateOrigRtvDao origRtvDao; @Override public voidrun() { log.info("InsertCaiYanShiJian 每33秒执行一次,时间为:" + newDate(System.currentTimeMillis()));
//注入失败,通过工具类注入  
if(origDLDao==null){ this.origDLDao = SpringBeanFactoryUtils.getBean(OrigDLDao.class); } if(origRtvDao==null){ this.origRtvDao = SpringBeanFactoryUtils.getBean(OrigRtvDao.class); } //具体逻辑} }; }     //定时任务2 privateRunnable AutoGetAllData(){ return newRunnable(){ @Autowired privateUtilDao utilDao; @Autowired privateClient client; @Override public voidrun() { //业务逻辑 log.info("AutoGetAllData 每十秒执行一次,时间为:" + newDate(System.currentTimeMillis())); if(utilDao==null){ this.utilDao = SpringBeanFactoryUtils.getBean(UtilDao.class); } if(client==null){ this.client = SpringBeanFactoryUtils.getBean(Client.class); } //具体逻辑} }; }
privateTrigger getTrigger(String taskName){ return newTrigger(){ @Override publicDate nextExecutionTime(TriggerContext triggerContext) { //触发器 if(getCron(taskName)==""){ return null; }else{ CronTrigger trigger = newCronTrigger(getCron(taskName)); returntrigger.nextExecutionTime(triggerContext); } } }; }
//通过任务名称获取Task,Task是一个对象,有任务ID,任务名称,任务描述,cron等
publicString getCron(String taskName) { Task task = this.taskService.getTaskByName(taskName); if(task==null){ return ""; }else{ returntask.getTaskCron(); }} }
SpringBeanFactoryUtils工具类
importorg.springframework.beans.BeansException;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;
importorg.springframework.stereotype.Component;

@Component
public class SpringBeanFactoryUtils implementsApplicationContextAware {
    private staticApplicationContext applicationContext;
    /*** 获取静态变量中的ApplicationContext.
     */
    public staticApplicationContext getApplicationContext() {
        returnapplicationContext;
    }
    /*** 从静态变量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) {
        returnapplicationContext.getBean(requiredType);
    }
    /*** 实现ApplicationContextAware接口, 注入Context到静态变量中.
     */@Override
    public void setApplicationContext(ApplicationContext applicationContext) throwsBeansException {
        this.applicationContext =applicationContext;
    }

免责声明:文章转载自《springboot 动态修改定时任务》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux配置文件的修改Java 基础 AutoCloseable &amp;amp; Closeable下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ipadmini从9.3.5降级8.4.1并完美越狱

ipadmini之前是iOS9.3.5实在是卡的用不了,于是打算降级,但是尝试了包括改版本描述等很多方法一直失败。今天突然成功降级8.4.1并且完美越狱,运行流畅了非常多。方法如下:打开网址:https://www.i4.cn/news_detail_18447.html,下载对应设备的8.4.1自制固件,一般的固件是不可以的。...

搭建Squid3 密码账号IP代理

默认端口是端口3128,它已被滥用。注意修改端口,并应用Squid密码帐户方法保护流量...

vsCode mongoDB插件 Azure Cosmos DB

安装完成后,要重启下vsCode会看到然后点击绿色的小按钮,选择MongoDB再输入MongoDB的连接地址。当然要先把本地的mongoDB数据库打开,cmd黑窗口输入mongod--dbpathxxxx打开本地数据库输入完成地址后,回车就可以连接到自己的MongoDB数据库了...

凤凰系统(Phoenix OS)PC版安装,电脑上体验功能丰富的安卓系统

Tid=9074&fid=12安装前准备下载最新的PhoenixOSIO安装映像,并将其刻录到USB闪存驱动器;如果使用Windows操作系统,建议使用UltraISO刻录。下载地址:http://www.phoenixos.com/download_x86开始安装。1.重新启动机器,从启动选项中选择USB闪存磁盘启动,然后选择“Installati...

当微信小程序遇到AR(二)

当微信小程序遇到AR,会擦出怎么样的火花?期待与激动......通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习。注册地址=˃注册成功之后,需要下载微信小程序开发工具。下载地址=˃目前笔者的开发环境是:Windows10下载的微信小程序版本为:RCv1.0.2.1909111 打开,微信开发者工具之后,会看到如下的页面。...

【转】 中兴OLT-C300常用命令

在当前的C220版本中,ONU类型名称在GPON和EPON中应该是唯一的。这里我们使用“ZTEG-F620”。ZXAN#ponZXAN#onu-typegponZTEG-F620描述4ETH,2POTSZXAN#onu-ifZTEG-F620eth_0/1-4ZXAN#onon-ifZTEG-F620pots_0/1-2ZXAN#on u type attr...