使用ThreadPoolTaskScheduler实现定时任务调度

ThreadPoolTaskScheduler轻量级多线程定时任务框架 面对一些小的功能需求点,如果需要非常灵活的进行处理定时任务处理,但是又因为你的需求需要使用到页面进行定时任务配置,显然使用Spring注解定时任务,无法满足你,这时你想到了xxl-job 或者 quezy等定时任务框架,但是过于繁琐,可能成本较大。那么本文将要解决你的问题。ThreadPoolTaskScheduler 内部方法非常丰富,本文实现的是一种corn表达式,周期执行schedule(Runnable task, Trigger trigger) corn表达式,周期执行。 阅读详情

在一个外包的项目开发中,甲方未提供xxl-job、quartz等定时任务调度框架,也不能在项目中随意引入新的框架,所以使用多线程ThreadPoolTaskScheduler的方式实现定时任务调度。

本文介绍了在项目限制条件下使用ThreadPoolTaskScheduler实现定时任务调度的解决方案。该方法在不引入额外框架的情况下,利用多线程机制实现了高效的定时任务调度功能,适用于框架受限的开发场景。

1、基本配置类和工具类

/**
 * 线程池配置
 */
@Configuration
public class SchedulingConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        // 定时任务执行线程池核心线程数
        int corePoolSize = Runtime.getRuntime().availableProcessors();
        taskScheduler.setPoolSize(corePoolSize);
        taskScheduler.setRemoveOnCancelPolicy(true);
        //线程名称前缀
        taskScheduler.setThreadNamePrefix("TaskSchedulerThreadPool-");
        //线程池在关闭时等待所有任务完成
        taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        //等待时长,超出时间强制销毁,防止长时间占用导致线程阻塞
        taskScheduler.setAwaitTerminationSeconds(60);
        //拒绝策略
        taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return taskScheduler;
    }
}


/**
 * ScheduledFuture包装类
 */
public final class ScheduledTask {

    public ScheduledFuture<?> future;

    /**
     * 取消定时任务
     */
    public void cancel() {
        ScheduledFuture<?> future = this.future;
        if (future != null) {
            future.cancel(true);
        }
    }
}


/**
 * Runnable实现类
 */
public class SchedulingRunnable implements Runnable {

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

    private String beanName;

    private String methodName;

    private String params;

    public SchedulingRunnable(String beanName, String methodName) {
        this(beanName, methodName, null);
    }

    public SchedulingRunnable(String beanName, String methodName, String params) {
        this.beanName = beanName;
        this.methodName = methodName;
        this.params = params;
    }

    @Override
    public void run() {
        try {
            Object target = SpringContextUtils.getBean(beanName);

            Method method = null;
            if (!StringUtils.isEmpty(params)) {
                method = target.getClass().getDeclaredMethod(methodName, String.class);
            } else {
                method = target.getClass().getDeclaredMethod(methodName);
            }

            ReflectionUtils.makeAccessible(method);
            if (!StringUtils.isEmpty(params)) {
                method.invoke(target, params);
            } else {
                method.invoke(target);
            }
        } catch (Exception ex) {
            logger.error(String.format("定时任务执行异常 - bean:%s,方法:%s,参数:%s ", beanName, methodName, params), ex);
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SchedulingRunnable that = (SchedulingRunnable) o;
        if (params == null) {
            return beanName.equals(that.beanName) &&
                    methodName.equals(that.methodName) &&
                    that.params == null;
        }

        return beanName.equals(that.beanName) &&
                methodName.equals(that.methodName) &&
                params.equals(that.params);
    }

    @Override
    public int hashCode() {
        if (params == null) {
            return Objects.hash(beanName, methodName);
        }

        return Objects.hash(beanName, methodName, params);
    }
}  


/**
 * 操作spring的bean工具类
 */
@Component
public class SpringContextUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

    public static <T> T getBean(Class<T> requiredType) {
        return applicationContext.getBean(requiredType);
    }

    public static <T> T getBean(String name, Class<T> requiredType) {
        return applicationContext.getBean(name, requiredType);
    }

    public static boolean containsBean(String name) {
        return applicationContext.containsBean(name);
    }

    public static boolean isSingleton(String name) {
        return applicationContext.isSingleton(name);
    }

    public static Class<? extends Object> getType(String name) {
        return applicationContext.getType(name);
    }
}

2、定时任务注册

/**
 * 定时任务注册
 */
@Component
public class CronTaskRegistrar implements DisposableBean {

    private final Map<Runnable, ScheduledTask> scheduledTasks = new ConcurrentHashMap<>(16);

    @Resource
    private TaskScheduler taskScheduler;

    public TaskScheduler getScheduler() {
        return this.taskScheduler;
    }

    public void addCronTask(Runnable task, String cronExpression) {
        addCronTask(new CronTask(task, cronExpression));
    }

    public void addCronTask(CronTask cronTask) {
        if (cronTask != null) {
            Runnable task = cronTask.getRunnable();
            if (this.scheduledTasks.containsKey(task)) {
                removeCronTask(task);
            }

            this.scheduledTasks.put(task, scheduleCronTask(cronTask));
        }
    }

    public void removeCronTask(Runnable task) {
        ScheduledTask scheduledTask = this.scheduledTasks.remove(task);
        if (scheduledTask != null)
            scheduledTask.cancel();
    }

    public ScheduledTask scheduleCronTask(CronTask cronTask) {
        ScheduledTask scheduledTask = new ScheduledTask();
        scheduledTask.future = this.taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger());

        return scheduledTask;
    }


    @Override
    public void destroy() {
        for (ScheduledTask task : this.scheduledTasks.values()) {
            task.cancel();
        }

        this.scheduledTasks.clear();
    }
}

3、定时任务预热

/**
 * 定时任务预热
 */
@Service
public class SysJobRunner implements CommandLineRunner {

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

    @Resource
    private CronTaskRegistrar cronTaskRegistrar;

    @Override
    public void run(String... args) {
        // 初始加载数据库里状态为正常的定时任务  
        ScheduleSetting existedSysJob = new ScheduleSetting();
        List<ScheduleSetting> jobList = existedSysJob.selectList(new LambdaQueryWrapper<ScheduleSetting>().eq(ScheduleSetting::getStatus, true));
        if (CollectionUtils.isNotEmpty(jobList)) {
            for (ScheduleSetting job : jobList) {
                SchedulingRunnable task = new SchedulingRunnable(job.getBeanName(), job.getMethodName(), job.getMethodParams());
                cronTaskRegistrar.addCronTask(task, job.getCron());
            }
            logger.info("定时任务已加载完毕...启用定时任务:{}个", jobList.size());
        }else {
            logger.info("定时任务启动成功...无定时任务");
        }
    }
} 

4、定时任务配置实体类、mapper、service、serviceImpl

@Data
@TableName("schedule_setting")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "定时任务表")
public class ScheduleSetting extends Model<ScheduleSetting> {
    private static final long serialVersionUID = 1L;

    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "ID")
    private Long id;

    @ApiModelProperty(value = "bean名称")
    private String beanName;

    @ApiModelProperty(value = "方法名称")
    private String methodName;

    @ApiModelProperty(value = "方法参数 json字符串")
    private String methodParams;

    @ApiModelProperty(value = "cron表达式")
    private String cron;

    @ApiModelProperty(value = "状态(1正常 0暂停)")
    private boolean status;

    @ApiModelProperty(value = "备注:存储用于辨识的字段,如排查任务id")
    private String remark;

    @ApiModelProperty(value = "创建时间")
    private Date createTime;

    @ApiModelProperty(value = "更新时间")
    private Date updateTime;

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

}


@Mapper
public interface  ScheduleSettingMapper extends BaseMapper<ScheduleSetting> {
}


public interface ScheduleSettingService extends IService<ScheduleSetting> {

    boolean addCheckTask(RiskCheckTaskVo riskCheckTaskVo) throws IllegalAccessException;

    boolean updateCheckTask(RiskCheckTaskVo riskCheckTaskVo) throws IllegalAccessException;

    //isChanges 是否启用任务
    boolean add(ScheduleSetting scheduleSetting, boolean isChanges);

    //isChanges 是否重新启用任务
    boolean update(ScheduleSetting scheduleSetting,boolean isChanges);

    boolean del(Long id);

    // 停止/启动任务
    boolean changesStatus(Long id, boolean status);
}


@Service
public class ScheduleSettingServiceImpl extends ServiceImpl<ScheduleSettingMapper, ScheduleSetting> implements ScheduleSettingService {

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

    @Resource
    private CronTaskRegistrar cronTaskRegistrar;

    @Override
    public boolean addCheckTask(RiskCheckTaskVo riskCheckTaskVo) throws IllegalAccessException {
        //转换cron表达式
        String cron = TaskUtils.toCronExpression(riskCheckTaskVo.getCycle(), riskCheckTaskVo.getCycleUnit(),riskCheckTaskVo.getStartTime());
        ScheduleSetting scheduleSetting = new ScheduleSetting();
        scheduleSetting.setBeanName("CheckTask");
        scheduleSetting.setMethodName("taskByParams");
        scheduleSetting.setMethodParams(JSON.toJSONString(riskCheckTaskVo));
        scheduleSetting.setCron(cron);
        scheduleSetting.setStatus(riskCheckTaskVo.getStatus());
        scheduleSetting.setRemark(riskCheckTaskVo.getId().toString());
        return add(scheduleSetting,false);
    }

    @Override
    public boolean updateCheckTask(RiskCheckTaskVo riskCheckTaskVo) throws IllegalAccessException {
        //转换cron表达式
        String cron = TaskUtils.toCronExpression(riskCheckTaskVo.getCycle(), riskCheckTaskVo.getCycleUnit(),riskCheckTaskVo.getStartTime());
        ScheduleSetting scheduleSetting = getOne(new LambdaQueryWrapper<ScheduleSetting>().eq(ScheduleSetting::getRemark, riskCheckTaskVo.getId().toString()));
        scheduleSetting.setMethodParams(JSON.toJSONString(riskCheckTaskVo));
        scheduleSetting.setCron(cron);
        scheduleSetting.setStatus(riskCheckTaskVo.getStatus());
        return update(scheduleSetting,false);
    }

    @Override
    public boolean add(ScheduleSetting scheduleSetting, boolean isChanges) {
        scheduleSetting.setCreateTime(new Date());
        scheduleSetting.setUpdateTime(new Date());
        boolean save = save(scheduleSetting);
        if (!save) {
            logger.error("添加定时任务失败,任务id:{},备注:{}", scheduleSetting.getId(), scheduleSetting.getRemark());
            return false;
        } else {
            if (isChanges && scheduleSetting.getStatus()) {// 添加成功,并且状态是1,直接放入任务器
                SchedulingRunnable task = new SchedulingRunnable(scheduleSetting.getBeanName(), scheduleSetting.getMethodName(), scheduleSetting.getMethodParams());
                cronTaskRegistrar.addCronTask(task, scheduleSetting.getCron());
            }
        }
        return true;
    }

    @Override
    public boolean update(ScheduleSetting scheduleSetting, boolean isChanges) {
        // 查询修改前任务
        ScheduleSetting existedSysJob = getById(scheduleSetting.getId());
        // 修改任务
        scheduleSetting.setCreateTime(new Date());
        scheduleSetting.setUpdateTime(new Date());
        boolean update = updateById(scheduleSetting);
        if (!update) {
            logger.error("修改定时任务失败,任务id:{},备注:{}", scheduleSetting.getId(), scheduleSetting.getRemark());
            return false;
        } else {
            // 修改成功,则先删除任务器中的任务,并重新添加
            SchedulingRunnable task1 = new SchedulingRunnable(existedSysJob.getBeanName(),
                    existedSysJob.getMethodName(),
                    existedSysJob.getMethodParams());
            cronTaskRegistrar.removeCronTask(task1);
            if (isChanges && scheduleSetting.getStatus()) {// 如果修改后的任务状态是1就加入任务器
                SchedulingRunnable task = new SchedulingRunnable(scheduleSetting.getBeanName(),
                        scheduleSetting.getMethodName(),
                        scheduleSetting.getMethodParams());
                cronTaskRegistrar.addCronTask(task, scheduleSetting.getCron());
            }
        }
        return true;
    }

    @Override
    public boolean del(Long id) {
        // 先查询要删除的任务信息
        ScheduleSetting existedSysJob = getById(id);
        // 删除
        boolean del = removeById(id);
        if (!del) {
            logger.error("删除定时任务失败,任务id:{},备注:{}", existedSysJob.getId(), existedSysJob.getRemark());
            return false;
        } else {
            // 删除成功清除定时任务器中的对应任务
            SchedulingRunnable task = new SchedulingRunnable(existedSysJob.getBeanName(),
                    existedSysJob.getMethodName(),
                    existedSysJob.getMethodParams());
            cronTaskRegistrar.removeCronTask(task);
        }
        return del;
    }

    @Override
    public boolean changesStatus(Long id, boolean status) {
        // 修改任务状态
        ScheduleSetting scheduleSetting = getById(id);
        scheduleSetting.setStatus(status);
        boolean update = updateById(scheduleSetting);
        if (!update) {
            logger.error("修改定时任务状态失败,任务id:{},备注:{}", scheduleSetting.getId(), scheduleSetting.getRemark());
            return false;
        }
        // 查询修改后的任务信息
        ScheduleSetting existedSysJob = getById(id);

        // 如果状态是1则添加任务
        if (existedSysJob.getStatus()) {
            SchedulingRunnable task = new SchedulingRunnable(existedSysJob.getBeanName(),
                    existedSysJob.getMethodName(),
                    existedSysJob.getMethodParams());
            cronTaskRegistrar.addCronTask(task, existedSysJob.getCron());
        } else {
            // 否则清除任务
            SchedulingRunnable task = new SchedulingRunnable(existedSysJob.getBeanName(),
                    existedSysJob.getMethodName(),
                    existedSysJob.getMethodParams());
            cronTaskRegistrar.removeCronTask(task);
        }
        return true;
    }
}

ThreadPoolTaskScheduler实现动态管理定时任务 最近,有个项目有需要用到定时任务,所以做了一个动态管理定时任务的模块。本文将从项目背景、需求、选型、思路、具体实现等方面展开介绍。 背景:有个支付类的项目,中间会产生一些中间态的订单,需要有个定时任务轮询确认订单状态。该类项目体量较小,单节点部署,客户比较多,需要简单快速的部署、维护。 需求:定时任务能够通过表达式灵活指定执行计划,并支持动态启动、关闭、修改。定时任务模块最好和业务包在一个jar包内,部署简单。 选型:说到定时任务,当下最... 阅读详情

相关推荐

Spring Boot中使用ThreadPoolTaskScheduler实现轻量级多线程定时任务

我们可以轻松地在Spring Boot应用中实现轻量级的多线程定时任务。在处理定时任务中的异常情况时,确保系统稳定性的关键在于正确地捕获和处理这些异常。例如,如果一个任务因为网络问题失败,可能在稍后重试时会成功。通过实施上述策略,可以显著提高定时任务的稳定性和可靠性,确保系统在面对异常情况时能够保持稳定运行。对于关键任务,可以考虑将任务持久化到数据库中,以便在系统崩溃后能够重新启动任务。如果可能,隔离可能导致异常的任务,以防止它们影响其他任务。实现监控机制,当任务失败时触发报警,以便及时响应。

心猿意码 1827

在 SpringBoot 中使用 ThreadPoolTaskScheduler 实现定时任务

在 SpringBoot 中使用 ThreadPoolTaskScheduler 来实现定时任务。

Wayfreem的博客 2万+

振动能量采集技术:从原理到实战,破解物联网供电难题

能量采集技术旨在捕获环境中的废弃能量(如机械振动、热能、光能)并将其转化为电能,其核心原理在于通过压电、电磁、静电或摩擦电等物理效应实现能量形式的转换。这项技术的核心价值在于为物联网(IoT)中难以布线或更换电池的分布式传感器节点、植入式医疗设备等提供近乎永续的电力解决方案,从而解决物联网部署的“最后一米供电”瓶颈。其应用场景广泛覆盖工业预测性维护、结构健康监测、可穿戴设备及消费电子等领域。本文聚焦于振动能量采集这一细分方向,深入剖析了压电式、电磁式、电容式及摩擦纳米发电机(TENG)等主流技术路线的实战考

weixin_42660494的博客 569

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor是Spring框架中用于任务调度和线程池管理的类。ThreadPoolTaskScheduler主要用于任务调度,按照时间间隔或Cron表达式执行任务。ThreadPoolTaskExecutor主要用于线程池管理,执行异步任务和多线程任务。

qq_41067796的博客 3180

一文看懂分布式存储架构

目录一、集中存储结构二、分布式存储1 、分布式存储的兴起2 、分布式存储的重要性3 、分布式存储的种类和比较三、分布式理论浅析1 、一致性和可用性2 、数据分布3 、复制4 、分布式协议5、跨机房部署四、分布式文件系统1、 Google 文件系统( GFS )2、 Taobao 文件系统( TFS )3、 Fackbook Haystack 文件系统4、 CDN 内容分发网络五、分布式键值系统1、 Amazon Dynamo2、 Taobao Tiar3、 ETCD4 、产品选型比较( Etcd , Zoo

weixin_70730532的博客 2万+

Gartner《构建可扩展数据产品建设框架》心得

数据产品化:从概念到落地的实践指南 当前企业正从传统数据需求模式转向数据产品化新范式。本文系统阐述了数据产品的核心价值、定义分类和实施框架,指出成功关键是将数据包装为可复用、可扩展的产品。Gartner框架强调产品思维,提出4阶段12步实施路径,涵盖设计、工程、发布和监控全流程。文章特别提醒要避免7大常见误区,如简单重命名报表、忽视元数据治理等,建议采取MVP策略,90天内完成从价值验证到产品落地的闭环。实施中需平衡技术选型与业务需求,建立跨职能团队,并通过AARRR模型持续追踪产品价值。

2501_91410404的博客 1006

ThreadPoolTaskScheduler-实现定时task的动态开启关闭

springboot的定时任务(scheduled)大多通过注解形式在项目启动时就自动执行,如果需要通过手动操作对定时任务task进行开启和关闭则需要使用spring的ThreadPoolTaskScheduler实现,当时Timer也可以实现,但是Timer对复杂要求的时刻执行无法处理(比例 固定某个时间段执行)。 第一步:实例化ThreadPoolTaskScheduler对象 @Auto...

liniannian198762的专栏 2223

手把手教你校准垂起固定翼(VTOL)遥控器与电调:从零到飞的完整流程

本文详细介绍了垂起固定翼(VTOL)遥控器与电调的校准流程,从基础认知到飞行前检查,涵盖遥控器通道配置、电调校准、舵机方向调整等关键步骤。通过图文并茂的指导,帮助无人机爱好者安全完成VTOL调试,确保首飞成功。特别强调多旋翼模式、过渡模式和固定翼模式的设置要点,适合新手和进阶用户参考。

jenkins8butler的博客 361

Springboot 通过ThreadPoolTaskScheduler实现定时任务动态增、删、改、启动、暂停

Springboot 通过Schedule实现定时任务动态增、删、改、启动、暂停 缺点:1、不支持分布式 2、本人未做界面开发,但是Controller层全部都已经定义好。 由于代码太多,值粘出部分代码,大家可以下载项目源码看看 数据库 CREATE TABLE `schedule_setting` ( `id` int(11) NOT NULL AUTO...

xcc_2269861428的博客 4188

ADS 使用教程(十八)Encrypting Designs using RFIP Encoder in ADS

在这一节,我们使用RFIP Encoder进行设计加密,这是一种保护知识产权和敏感设计数据的重要方法。RFIP Encoder提供了一种安全的方式来加密设计文件,确保只有授权人员能够访问和使用这些文件。

Dirge19的博客 1172

在Keil uv5里面添加STC元器件库,不影响其他元件

先到网上下载stc.CBD(宏晶网站的地址实效了)还有STC新系列单片机的头文件,宏晶的网站就有1、在Keil/C51/INC下新建目录"STC"文件夹, 把所有STC新系列单片机的头文件拷贝到"STC"目录下。2、下载的用于keil下的STC器件数据库更名为STC.CDB并拷贝到Keil/UV4目录下。3、打开Keil文件夹下的TOOLS.ini文件。4、在[UV2]下键入CDB0="UV2\S

技术联盟 1万+

基于ThreadPoolTaskScheduler的定时任务自动执行和手动开启关闭

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.co...

u011584350的博客 3473

ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

动态生成障碍物在机器人导航、碰撞避障算法测试、多机协同等领域应用广泛,可以帮助开发人员快速测试,本文介绍该技术并提供基于ROS Gazebo的实现

FRIGIDWINTER的博客 4901

SpringAop + ThreadPoolTaskScheduler + 自定义注解实现动态定时任务

一、前述 在平时生活中,闲下来总会思考一些现实中已经拥有的东西,工具或者软件,假如自己是这些的开发者,我怎么去实现这个功能,于是乎,哼哧哼哧,实现一个最简单类似闹钟动态定时,开动 二、关于定时的那些过往 1、Timer 相信是许多程序员接触的第一个定时的类库,它属于 java.util 下,还记得当时,用 Timer 跑起来第一个定时任务的时候,这是多么神奇,它自己动了。言归正题,Timer 内部...

TanXi的博客 2064

常用元器件使用方法13:物理层接口芯片DP83848的使用方法

介绍: DP83848是以太网物理层接口芯片,具有多种型号,从便于焊接角度考虑LQFP-48封装较为合适,采用LQFP-48封装的芯片,有2种型号,分别为DP83848I和DP83848C,如下图所示。 其主要区别是使用温度不同,如下图所示。 这2种芯片芯片网上均有销售,按理说DP83848C价格应该更加便宜,实际不然,DP83848I的价格低于DP83848C,考虑或与芯片的出货量...

snmplink的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

定时任务解决方案2,Spring提供的ThreadPoolTaskScheduler

 主要是使用org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler它是由spring提供的定时任务类 ,特点是可以使用cron表达式,当然,结合ioc和annotation,还是非常好用的.   package cn.test.schedule.spring;import org.springf

Allchin 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java scheduler 未调度,SpringBoot2 task scheduler 定时任务调度器四种方式

使用@EnableScheduling方式@Component@Configurable@EnableSchedulingpublic class Task1 {private static Log logger = LogFactory.getLog(Task1.class);@Scheduled(cron = "0/2 * * * * * ")public void execute() {lo...

weixin_28761983的博客 599

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

spring 动态定时任务

使用的是spring的ThreadPoolTaskScheduler定时线程池,其有以下四种方法进行定时任务发布: 1. schedule(Runnable task, Date stateTime),在指定时间执行一次定时任务 2. schedule(Runnable task, Trigger trigger),动态创建指定表达式cron的定时任务 3. scheduleAtFixedR...

于先森 4700

Spring Boot如何实现定时任务调度?

在Web应用程序中,我们经常需要定时执行一些任务,例如定时清理缓存、定时发送邮件等。这些任务通常需要在固定的时间间隔内执行,以保证系统的正常运行。定时任务调度就是指在指定的时间间隔内执行一些任务的过程。本文介绍了Spring Boot如何实现定时任务调度,并提供了一个使用@Scheduled注解实现定时任务调度的示例代码。我们还介绍了一些使用@Scheduled注解时需要注意的事项,以及如何配置定时任务的线程池。

Java徐师兄的博客 1378

springboot实现定时任务

一、序言: ...

大仙的博客 738

springboot2 task scheduler 定时任务调度器四种方式

使用@EnableScheduling方式 @Component @Configurable @EnableScheduling public class Task1 { private static Log logger = LogFactory.getLog(Task1.class); @Scheduled(cron = &amp;amp;amp;quot;0/2 * * * * * &amp;amp;amp;quot;) pu...

o_cYj的专栏 3009

ThreadPoolTaskScheduler实现定时任务

public class SchedulingTask { private static ThreadPoolTaskScheduler threadPoolTaskScheduler; static { threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setThreadNamePrefix("MySchedulingTask-"); ...

Bingmous的博客 789

基于ThreadPoolTaskScheduler手写任务调度

背景 考虑到系统中使用...

法号钦尘的博客 613

springboot -- 自带定时器实现定时任务的开启关闭以及定时时间可以配置

参考文章:springboot自带定时器实现定时任务的开启关闭以及定时时间可以配置 一. 序言 最近项目需要用到定时任务,需要完成一个定时功能。经过了解,项目中目前实现定时任务,一般有三种选择: 一是用Java自带的timer类。稍微看了一下,可以实现大部分的指定频率的任务的调度(timer.schedule()),也可以实现关闭和开启(timer.cancle)。但是用其来实现某天的某个时...

justlpf的专栏 1万+

玩转SpringBoot动态定时任务(启动、暂停)

最近在做一个项目,需要用到动态定时任务,现在比较普遍的做法是集成第三方框架(例如Quartz、XXL-JOB),但是基于项目本身的复杂度和使用场景,使用springBoot自身带有的定时任务框架来实现

Tan_xiong的博客 1570

ThreadPoolTaskScheduler 和 ThreadPoolTaskExecutor的区别

‌ThreadPoolTaskScheduler 和 ThreadPoolTaskExecutor是Spring Framework中用于管理线程池的两个重要类,

weixin_40991408的博客 735
上一篇: java设计者模式:原型模式
下一篇: springAi+阿里云百炼平台+deepseek,在业务系统中接入ai智能体,实现对业务方面的问答
String_001
博客等级 码龄5年 16粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值