SpringBoot开启动态定时任务并手动、自动关闭

这篇具有很好参考价值的文章主要介绍了SpringBoot开启动态定时任务并手动、自动关闭。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景需求:在执行某个方法的两小时之后进行某个操作

涉及:定时任务、哈希表

需要注意:

  1. 业务逻辑层是单一实例的,所以在定时任务类内操作业务逻辑层的某个属性和在业务逻辑层内操作的都是同一个。
  2. 使用Map存放数据不要用IdentityHashMap,因为IdentityHashMap比较key值用的是“==”,也就是直接比较地址,所以用taskId作为key值取不出来。

疑问:ThreadPoolTaskScheduler线程池需不需要规定线程数量?文章来源地址https://www.toymoban.com/news/detail-821402.html

定时任务类

@Component
public class VideoRecorderScheduler {
    private final TestService testService = SpringContextHolder.getBean(TestService.class);
	
    public VideoRecorderScheduler(TaskScheduler taskScheduler) {
        this.taskScheduler = taskScheduler;
    }

    // 开启定时任务
    public ScheduledFuture startVideoRecording(){
        //System.out.println("开始啦--------------------");
        // 记录开启时间
        startTime = System.currentTimeMillis();
        //开启任务 两小时后自动执行停止任务 可以改成两分钟方便测试
        stopTask = taskScheduler.schedule(this::stopVideoRecording, Instant.now().plusSeconds(2 * 60 * 60));
        return stopTask;
    }

    // 停止定时任务
    private void stopVideoRecording(){
        // 执行其他操作
        // ...
		
        // 关闭定时任务
        if (stopTask != null && !stopTask.isCancelled()) {
            stopTask.cancel(true);
            testService.getScheduledTasks().remove(taskId);
        }
    }
}

测试类 testService

@Service
public class TestService(){
    // 存放定时任务的map
    @Getter
    private ConcurrentHashMap<String,ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();
    // 用IdentityHashMap取不出来数据,取出的是null
    // 因为IdentityHashMap,比较key值,直接使用的是==,也就是比较地址
    // private Map<String, ScheduledFuture<?>> scheduledTasks = new IdentityHashMap<>();
	
    public void start(){
	//开启定时任务
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); // 创建一个ThreadPoolTaskScheduler对象
        taskScheduler.initialize(); // 初始化taskScheduler
        VideoRecorderScheduler videoRecorder = new VideoRecorderScheduler(taskScheduler); // 创建一个带参数的VideoRecorder对象
        //放入map
        ScheduledFuture stopTask = videoRecorder.startVideoRecording();
        scheduledTasks.put(taskId,stopTask);
    }
	
	public void stop(){
	    //取消定时任务
            ScheduledFuture<?> stopTask = scheduledTasks.get(taskId);
            scheduledTasks.remove(taskId);
            if (stopTask != null && !stopTask.isCancelled()) {
                stopTask.cancel(true);
            }
	}
}

到了这里,关于SpringBoot开启动态定时任务并手动、自动关闭的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot实现固定、动态定时任务 | 三种实现方式

    阅读完本文:🐱‍👓 知晓 SpringBoot 用注解如何实现定时任务 明白 SpringBoot 如何实现一个动态定时任务 (与数据库相关联实现) 理解 SpringBoot 实现设置时间执行定时任务 (使用 ThreadPoolTaskScheduler 实现) 用注解实现是真的简单,只要会 cron 表达式就行。🧙‍♂️ 第一步 :

    2024年02月16日
    浏览(41)
  • SpringBoot 动态操作定时任务(启动、停止、修改执行周期)增强版

    前段时间编写了一篇博客 SpringBoot 动态操作定时任务(启动、停止、修改执行周期 ,该篇博客还是帮助了很多同学。 但是该篇博客中的方法有些不足的地方: 只能通过前端控制器controller手动注册任务。【具体的应该是我们提前配置好我们的任务,配置完成后让springboot应用

    2024年02月13日
    浏览(41)
  • 任务调度框架-如何实现定时任务+RabbitMQ事务+手动ACK

    比如: 1.每天早上6点定时执行 2.每月最后一个工作日,考勤统计 3.每个月25号信用卡还款 4.会员生日祝福 5.每隔3秒,自动提醒 10分钟的超时订单的自动取消,每隔30秒或1分钟查询一次订单,拿当前的时间上前推10分钟 定时任务,资源会有误差的存在,如果使用定时任务 定时

    2024年02月08日
    浏览(38)
  • xxl-job定时任务配置应用以及添加到自己已有的springboot项目中实现动态API调用

    XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 本篇文章主要是对xuxueli的xxl-job做一个简单的配置,以及将其添加到自己已有的项目中进行api调用。 一、xxl-job安装 1、首先

    2024年02月03日
    浏览(40)
  • 如何在Django中使用django-crontab启动定时任务、关闭任务以及关闭指定任务

    安装django-crontab包: 在Django项目的settings.py文件中,找到INSTALLED_APPS配置,并添加\\\'django_crontab\\\'到列表中: 在settings.py文件的末尾,添加以下配置以设置定时任务的时间间隔: 假设我们有一个名为myapp的应用,其中定义了task1、task2和task3三个定时任务。具体参数设置看这里 在终端中

    2024年02月09日
    浏览(48)
  • 【六袆 - windows】windows计划任务,命令行执行,开启计划任务,关闭计划任务,查询计划任务

    您可以使用以下方法: 使用任务计划程序:任务计划程序是 Windows 内置的工具,可以用于创建、编辑和管理计划任务。您可以按照以下步骤查看已设置的计划任务: 按下 Win + R 键,然后输入 “taskschd.msc”,按 Enter 键打开任务计划程序。 在任务计划程序窗口中,您可以查看

    2024年02月12日
    浏览(42)
  • Qt多线程开启定时任务

    多线程执行一些耗时操作,并且需要固定时间去轮询。

    2024年02月12日
    浏览(38)
  • Spring boot开启定时任务

       使用@Scheduled 注解很方便,但缺点是当我们调整了执行周期的时候,需要重启应用才能生效,这多少有些不方便。为了达到实时生效的效果,那么可以使用接口来完成定时任务,统一将定时器信息存放在数据库中。 1. 在mysql中执行一下脚本插入定时任务: 2. Mapper层 3. 

    2024年02月10日
    浏览(38)
  • ubuntu环境下开启定时任务crontab

    在工程化过程中遇到一个需求,需要在ubuntu环境下开启一个定时任务,定时执行sh脚本,下面参考网上的解决方案记录如下。 linux中crontab命令用于设置周期性被执行的指令,该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。 可以使用

    2024年02月09日
    浏览(62)
  • 工具的服务端口已关闭。要使用命令行调用工具,请在下方输入 y 以确认开启,或手动打开工具 -> 设置 -> 安全设置,将服务端口开启

    问题:工具的服务端口已关闭。要使用命令行调用工具,请在下方输入 y 以确认开启,或手动打开工具 - 设置 - 安全设置,将服务端口开启 解决方式:打开微信开发者工具——设置——安全——服务端口(开启)

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包