首页 > 其他分享 >SpringBoot开启动态定时任务并手动、自动关闭

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

时间:2024-01-24 18:15:20浏览次数:46  
标签:taskScheduler SpringBoot 手动 任务 stopTask 定时 public ThreadPoolTaskScheduler

场景需求:在执行某个方法的两小时之后进行某个操作
涉及:定时任务、哈希表
需要注意:业务逻辑层是单一实例的,所以在定时任务类内操作业务逻辑层的某个属性和在业务逻辑层内操作的都是同一个。
疑问:ThreadPoolTaskScheduler线程池需不需要规定线程数量?

定时任务类

@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 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);
            }
	}
}

标签:taskScheduler,SpringBoot,手动,任务,stopTask,定时,public,ThreadPoolTaskScheduler
From: https://www.cnblogs.com/alwaysBug/p/17984813

相关文章

  • Java21 + SpringBoot3整合Redis,使用Lettuce连接池,推荐连接池参数配置,封装Redis操作
    目录前言相关技术简介Redis实现步骤引入maven依赖修改配置文件定义Redis配置类定义Redis服务类,封装Redis常用操作使用Redis服务类总结前言近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展......
  • 搞起来,使用 SpringBoot 框架徒手撸一个安全、可靠的本地缓存工具
    在实现本地缓存的时候,我们经常使用线程安全的ConcurrentHashMap来暂存数据,然后加上SpringBoot自带的@Scheduled定时刷新缓存。虽然这样可以实现本地缓存,但既不优雅也不安全。那看一下我的思路,首先看一张图!1.每个处理器都有缓存名字、描述信息、缓存初始化顺序等信息,所以应该定义一......
  • 策略模式【结合springboot实现】
    Hello!~大家好啊,很高兴我们又见面了,今天我们一起学习设计模式–【策略模式】初次对此模式不懂的,或者想偷懒的,我强烈建议大家跟着我的一起把概念和代码一起敲一遍!~为啥子??因为我就是这样学会的,哈哈哈!1.首先我们看下此模式的整体UML图selector:选择器又叫做上下文conte......
  • 如何查找SpringBoot应用中的请求路径(不使用idea)
    背景昨天有个同事向我咨询某个接口的物理表是哪个,由于公司业务较多、这块业务的确不是我负责的,也没有使用idea不能全局搜索(eclipse搜不到jar内的字符串),也就回复了不清楚。除了自己写代码输出servlet的路径和类外,发现了一个我之前没用过的方法:SpringBootActuator,分享给大家。......
  • SpringBoot可视化接口开发工具magic-api
    magic-api简介magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象。在SpringBoot中使用1、添加magic-api相关依赖<!--接口快速开发框架 magic-api--><depen......
  • SpringBoot实现RequestBodyAdvice和ResponseBodyAdvice接口
    SpringBoot提供了一种机制,允许开发者在请求体(RequestBody)和响应体(ResponseBody)被处理之前和之后执行自定义逻辑。这通过RequestBodyAdvice和ResponseBodyAdvice接口实现。RequestBodyAdvice:此类用于在请求体被处理之前执行自定义逻辑。例如,你可以使用它来解析请求体,或者......
  • SpringBoot是什么
    SpringBoot帮我们简单、快速地创建一个独立的、生产级别的Spring应用(说明:SpringBoot底层是Spring)大多数SpringBoot应用只需要编写少量配置即可快速整合Spring平台以及第三方技术特性:快速创建独立Spring应用SSM:导包、写配置、启动运行直接嵌入Tomcat、J......
  • 揭秘 Docker 网络:手动实现 Docker 桥接网络
    本文将带领读者探索Docker桥接网络模型的内部机制,通过手动实现vethpair、bridge、iptables等关键技术,揭示网络背后的运作原理。如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注微信公众号。搜索公众号【探索云原生】即可订阅1.概述Docker有多......
  • 关于springboot 域认证
    最近项目,客户要求实现域认证,然后登录。网上资料自己整理一下,以备后续使用;springboot域认证,我采用的是ldap方式认证。1.引入插件:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-ldap</artifactId......
  • shardingsphere springboot application.yml配置
    shardingsphere springbootapplication.yml配置 spring:sharding-sphere:datasource:names:mastermaster:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql:......