首页 > 其他分享 >SpringBoot动态定时任务

SpringBoot动态定时任务

时间:2024-05-23 10:30:20浏览次数:26  
标签:warCron SpringBoot getCronId public 任务 定时 动态 cronId scheduledFutures

其实SchedulingConfigurer实现方法很简单,只需要实现SchedulingConfigurer并重写configureTasks方法,在启动类必须加上@EnableScheduling注解即可。

@Configuration
@EnableScheduling
@Slf4j
public class RuleTask implements SchedulingConfigurer {

    private volatile ScheduledTaskRegistrar registrar;
    private ConcurrentHashMap<Long, ScheduledFuture<?>> scheduledFutures = new ConcurrentHashMap<>();
    private ConcurrentHashMap<Long, CronTask> cronTasks = new ConcurrentHashMap<>();

    @Override
    public void configureTasks(ScheduledTaskRegistrar registrar) {
        registrar.setScheduler(Executors.newScheduledThreadPool(30));
        this.registrar = registrar;
    }

    /**
     * 刷新任务
     * cronList是数据库查出来的定时任务列表
     * @param ruleList
     */
    public void refresh(List<WarCron> cronList) {
        //取消已经删除的任务
        Set<Long> cronIds = scheduledFutures.keySet();
        for (Long cronId : cronIds) {
            if (!exists(cronList, cronId)) {
                scheduledFutures.get(cronId).cancel(false);
            }
        }
        if (cronList != null) {
            for (WarCron warCron : cronList) {
                String expression = warCron.getCron();
                //定时任务已存在且表达式未发生变化时跳过
                if (scheduledFutures.containsKey(warCron.getCronId()) && cronTasks.get(warCron.getCronId()).getExpression().equals(expression)) {
                    continue;
                }
                //如果执行时间发生了变化,则取消当前的定时任务
                if (scheduledFutures.containsKey(warCron.getCronId())) {
                    scheduledFutures.get(warCron.getCronId()).cancel(false);
                    scheduledFutures.remove(warCron.getCronId());
                    cronTasks.remove(warCron.getCronId());
                }
                CronTask task = new CronTask(
                        new Runnable() {
                            @Override
                            public void run() {
                                System.out.println("------------定时任务--------------");
                            }
                        }, warCron.getCron()
                );
                ScheduledFuture<?> future = registrar.getScheduler().schedule(task.getRunnable(), task.getTrigger());
                cronTasks.put(warCron.getCronId(), task);
                scheduledFutures.put(warCron.getCronId(), future);
            }
        }
    }

   /**
     * 判断是否有该任务
     *
     * @param warCronList
     * @param cronId
     * @return
     */
    private boolean exists(List<WarCron> warCronList, Long cronId) {
        for (WarCron warCron : warCronList) {
            if (cronId.equals(warCron.getCronId())) {
                return true;
            }
        }
        return false;
    }
}

每次新增编辑删除数据库中的任务时都需刷新下任务 以达到任务的动态变化
启动boot时也需执行refresh方法;

/**
 * @Author: pandar
 * @Date: 2021/3/12 0012 上午 11:57
 * @Description:  项目启动后刷新定时任务
 */
@Component
public class ApplicationRunnerConfig implements ApplicationRunner {

    @Autowired
    private RuleTask ruleTask;
    @Autowired
    private WarCronService warCronService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        List<WarCron> warCronList = warCronService.selectWarCronAll();
        ruleTask.refresh(ruleList);
    }
}

标签:warCron,SpringBoot,getCronId,public,任务,定时,动态,cronId,scheduledFutures
From: https://www.cnblogs.com/leepandar/p/18207812

相关文章

  • SpringBoot发送邮件(一)
    POM依赖<!--发送邮件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>邮箱配置mail:host:smtp.partner.outlook.cn#发送邮件服务器user......
  • 动态sbm模型dsbm复现
    大家新年好!今天推出的是动态SBM模型,参考文献是:《DynamicDEA:Aslacks-basedmeasureapproach》,文献doi是:10.1016/j.omega.2009.07.003不同于常见的DEA模型只能处理截面数据,动态SBM模型能够处理面板数据,其结构如下:其中的链接变量,carry-over分为以下四种:(1)理想的(好的)链接,这......
  • 2022-05-18-空间静态kernel核密度、空间动态kernel核密度工具更新
    在前版本基础上,针对有用户反映当数据有极端大的异常值时,画出的图不美观,具体表现在等高线集中在某一小块区域的问题,对此做出改进如下:增加坐标轴范围的选项,该选项的范围为1-100,代表将数据从小到大排列后,取前百分之多少的量,以剔除极端大值。当数据中没有极端大值时,该项填100,当极端大......
  • 2022-05-07-无条件、空间静态、空间动态kernel核密度工具
    今天要介绍的是一个目前论文中常用到的方法:无条件kernel核密度、空间静态kernel核密度和空间动态kernel核密度。Kernel核密度估计属于非参数估计方法,不过分依赖模型,可以用来研究各地区的不平衡分布问题。假设f(x)是随机变量X的的密度函数,Xi为独立同分布的观测值,x为均值,h为带宽。......
  • 【SpringBoot】服务停止数据源的关闭时机
    1 前言微服务中我们会用到数据源,数据源中其实就是管理我们的数据库连接,对于数据库而言,连接数是很珍贵的资源,所以释放无用或者长时间空闲的连接显得很重要。那么对于微服务比如我们的SpringBoot当服务启动的时候会初始化数据源,那么停止的时候,是如何关闭数据源,释放连接的呢?这......
  • element ui 动态表头不刷新问题
    今天弄vue前端,动态表头出现如题问题。代码如下<el-table-columnv-for="(item,index)intableHeads":key="index"><templateslot="header">//处理表头业务逻辑……<div>{{item.num}}</div></template></el-table-column>......
  • 在springboot项目中,打包本地的外部jar包,到运行的jar包中
    1、配置依赖<dependency><groupId>com.genesyslab</groupId><artifactId>genesyslab</artifactId><version>1.0.0</version><scope>system</scope><systemPath>${project.basedir}/src/main/re......
  • springboot开启热部署
    一、依赖在SpringBoot中启用热部署通常涉及使用SpringBootDevTools依赖和配置。以下是如何在SpringBoot项目中启用热部署的步骤:在pom.xml中添加SpringBootDevTools依赖:<dependencies><!--其他依赖--><dependency><groupId>org.springframework.b......
  • 使用安卓片段创建动态-UI-全-
    使用安卓片段创建动态UI(全)原文:zh.annas-archive.org/md5/483E44769E1E47CD0C380E136A5A54D5译者:飞龙协议:CCBY-NC-SA4.0前言移动应用静态用户界面挤在微小屏幕上的日子已经一去不复返了。如今,用户期望移动应用是动态且高度交互的。他们希望在中分辨率智能手机上查看应用......
  • springboot中执行完某些逻辑后,才算bean加载完,applicationContext才加载完毕
    核心思想实现InitializingBean接口,重写afterPropertiesSet方法范例代码importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.InitializingBean;importorg.springframework.stereotype.Component;@Slf4j@ComponentpublicclassDemoimplementsI......