使用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万+

奇安信 2025 年护网蓝队初选笔试题(附答案解析)

熬夜为大家整理了 奇安信 2025 年护网蓝队初选笔试题,(关注我我会持续更新)涵盖 SQL 注入、Web 安全、渗透测试、二进制安全 等核心知识点,并附上详细答案解析,助力大家高效备考!12.下列关于虚表指针描述正确的是(1.5分)✅ B. 虚表指针存储的是虚表的首地址❌ A. 任何类对象都存在虚表指针(仅含虚函数的类有)❌ C. 虚表指针位于对象内存空间的起始处(由编译器决定)❌ D. 虚表指针是否存在不影响对象所占内存空间的大小(存在时会增加指针大小)📌 解析:虚表指针(vptr)用于实现多态,指向

Aishenyanying33的博客 4699

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor

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

qq_41067796的博客 3180

一款值得关注的开源企业管理ERP系统

盒木ERP是一款开源的现代化企业管理系统,采用前后端分离架构,后端基于Python+Django,前端使用Vue+Ant Design。系统涵盖采购、销售、库存、财务等核心业务模块,支持移动端操作和PDA扫码。具有开源免费、技术先进、功能完善等特点,适合中小企业使用或二次开发。项目提供详细部署指南,支持Docker容器化部署,是学习ERP系统开发和企业数字化转型的优秀选择。

1110

基于Dify Agent构建智能客服:攻克知识库查询、多轮对话、安全鉴权与人机协同

基于Dify Agent构建智能客服,并将知识库等核心能力工具化,再通过Chatflow进行流程编排,是一种强大且灵活的策略。它不仅解决了当前AI客服面临的诸多核心挑战,也为未来的功能扩展和智能化升级打下了坚实的基础。希望本文能为您在构建高效、智能的AI客服系统之路上提供有益的参考!dify实验室基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify工作流案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。关注我,获取Dify相关资源(DSL、token、交流群等)。

同名公众号:dify实验室 3742

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

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

liniannian198762的专栏 2223

STM32F407 BootLoader实战:从零搭建到OTA升级(附完整源码)

本文详细介绍了为STM32F407微控制器从零搭建BootLoader并实现稳定OTA升级的完整实战指南。内容涵盖Flash分区规划、链接脚本配置、核心跳转逻辑、中断向量表重定向、可靠的升级流程设计,并深入探讨了双备份与回滚机制以提升工业级可靠性。文章提供了可直接使用的代码框架,并分享了关键调试技巧,帮助开发者快速掌握STM32远程固件更新技术。

weixin_29192211的博客 445

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

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

xcc_2269861428的博客 4188

微信小店推客分销系统源码获取与自研开发全攻略(2025年最新版)

源码选择建议快速试错:选用开源项目(如启航系统),3天可上线基础功能长期布局:购买商业源码授权,重点定制分佣规则与UI交互完全自研:适合年GMV过亿的大型企业,需前置投入风控与合规设计行动清单注册微信开放平台账号,完成视频号机构认证下载开源项目代码,部署本地测试环境联系三家源码供应商,获取合规性审计报告设计三级分佣比例表,通过法律顾问合规审查通过以上路径,可高效构建合规、稳定、高转化的微信小店推客分销系统,抢占2025年视频号电商红利。

2401_85184777的博客 1286

如何使用 Python 爬虫获取猫眼电影数据:电影评分与评论分析

随着互联网的快速发展,越来越多的人开始使用各种在线平台来了解电影信息,猫眼电影作为一个非常流行的在线电影票务平台,提供了详细的电影评分、评论和票房数据。本篇博客将详细介绍如何使用 Python 爬虫技术获取猫眼电影平台上的电影数据,重点关注电影评分和用户评论的爬取,分析其背后的数据处理和反爬虫技术。如果你对数据分析、电影评论分析等话题感兴趣,可以根据本文的示例进一步深入挖掘更多的数据,为决策提供支持,或为电影产业的相关研究提供有价值的分析依据。有些猫眼电影的页面数据是动态加载的,使用。

2201_76125261的博客 1623

基于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

基于simulink创建一个针对双馈异步风力发电机并网运行的仿真模型

摘要:本文详细介绍了基于Simulink的双馈异步风力发电机(DFIG)并网运行仿真建模方法。系统包含风速输入、风力机、双馈发电机、电力电子变换器、控制器和并网接口等模块,通过8个步骤完整呈现了建模流程,包括风速模拟、机械功率计算、发电机特性建模、变流器控制策略设计等关键环节。仿真可评估系统在不同风速条件下的动态响应、最大功率跟踪能力和发电效率,为风力发电系统的优化设计提供有效验证手段。模型可根据实际需求扩展环境因素和电网交互等细节,提高仿真精度。

amy_mhd的博客 336

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

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

TanXi的博客 2064

基于Simulink的转向控制系统仿真建模示例

本文完成了基于 Simulink 的 EPS 转向控制系统仿真,实现了:✅掌握 EPS 助力控制基本原理✅构建车速敏感的可变助力策略✅在 Simulink 中验证低速轻便、高速沉稳的手感✅达成“安全、舒适、高效”的现代转向系统。

xiaoheshang_123的博客 88

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

Allchin 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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、付费专栏及课程。

余额充值