返回顶部
首页 > 资讯 > 精选 >如何搭建基于Spring Task实现动态管理任务
  • 288
分享到

如何搭建基于Spring Task实现动态管理任务

2023-06-15 13:06:22 288人浏览 薄情痞子
摘要

这篇文章主要讲解了“如何搭建基于spring Task实现动态管理任务”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何搭建基于Spring Task实现动态管理任务”吧!什么是定时任务定时

这篇文章主要讲解了“如何搭建基于spring Task实现动态管理任务”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何搭建基于Spring Task实现动态管理任务”吧!

什么是定时任务

定时任务是指调度程序在指定的时间或周期触发执行的任务,常用场景如下:

  • 定时发短信

  • 定时变更数据

  • 定时统计数据

  • 定时修改状态

  • 定时开始活动等

常见几种JAVA实现方式

Timer

简介:Timer 是 jdk自带的定时任务执行类,无论任何项目都可以直接使用 Timer 来实现定时任务,所以 Timer 的优点就是使用方便。

原理:

  • 调度器:单线程

  • 任务存储:最小堆实现任务存储。

优点:Jdk自带类,无需引入其他jar,简单易用。

缺点:Timer中的多个任务只能使用一个线程去执行,因此任务之间的执行情况会相互影响。

  • 当一个任务的执行时间过长时,会影响其他任务的调度任务异常影响其他任务。

  • 当一个任务抛出异常,其他任务也会终止运行.

结论:基本无人使用。

ScheduledExecutorService

简介:ScheduledExecutorService  是JDK里面自定义的几种线程池中的一种,支持多线程并发的去执行多个调度任务,弥补了Timer的缺陷。

原理:

  • 调度器:多线程。

  • 任务存储:最小堆实现任务存储。

优点:Timer能做到的事情ScheduledExecutorService都能做到,且完美的解决上面所说的Timer存在的两个问题。

缺点:只支持固定速率(fixed-rate)或固定延迟(fixed-delay)的调度任务,不灵活。

结论:常用于框架内部定时任务。

Spring Task

描述:Spring Framework 自带的定时任务。

优点:同ScheduledExecutorService,同时增加了支持cron表达式,可以配置任意基于时钟的调度任务。

缺点:

  • 不支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务。

  • 不支持在线监控执行的任务。

原理:ScheduledExecutorService的扩展。

结论:常用于中小型企业,作为单机定时任务使用。

以上都是单机版本。

其他分布式定时任务诸如:quartz、xxl-job、elastic-job等等,功能、性能都很强劲,这里不作为研究对象,详情参考:

  • Java定时任务框架对比

  • 定时任务实现原理 最小堆 时间轮

上面的这些框架都不是我想选择的,要想自由的掌控雷电,那就自己造个简易轮子,满足90%需求即可。

期望实现如下特性:

  • 轻量、轻量、轻量。

  • 支持在线监控执行的任务。

  • 支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务。

  • 支持在线配置调度任务入参和。

  • 支持集群环境扩展(可选)。

收集了半天信息,直接使用Spring Task就可以实现,仅依赖Spring Boot

Spring Task详解

初级静态配置任务

代码示例:

@Component  @EnableScheduling // 开启定时任务 public class DemoApplication {  // 添加定时任务     @Scheduled(cron = "0/5 * * * * *") // cron 表达式,每5秒执行     public void doTask(){         System.out.println("我是定时任务~");     } }

无法动态修改任务状态、暂停/恢复任务,以及终止运行中任务。

进阶动态配置任务

实现设计

关键技术点和坑

  • Spring  Task的调度器默认是线程数为1的ThreadPoolTaskScheduler,自动装配类为TaskSchedulingAutoConfiguration,多任务之间的执行会相互影响,一定要修改默认值。

  • 通过TaskScheduler接口,可以扩展实现动态修改任务状态、暂停/恢复任务,以及终止运行中任务。

    • TaskScheuler是在Spring  3.0中引入的,有多种方法可以在将来的某个时刻运行,它还返回ScheduledFuture接口的对象,可用于取消计划的任务或检查任务是否完成。

  • cron-utils一个Java库,用于解析,验证Cron表达式,可以去GitHub查看详细说明。

实现设计

定义IJob接口,用于客户端描述任务

public interface IJob {     void execute(JobContext map) throws JobException; }

定义注解,用于配合IJob接口定义任务

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Job {      @AliasFor(annotation = Component.class)     String value() default "";           String cron() default "-";           String taskCode();           String taskName();  }

定义运行任务状态

public class Task{          private String taskCode;          private String taskName;          private String taskClassName;          private String taskCron;      @JSONIgnore     private ScheduledFuture scheduledFuture;      @jsonIgnore     private IJob job;      private TaskStateEnum taskState;

定义任务存储接口,用于存储在缓存或者DB中

public interface ITaskStore {      void saveTask(Task task);      List<Task> list();      Task updateTaskByTaskCode(String taskCron, String taskName, String taskCode);      Task updateTaskStateByTaskCode(TaskStateEnum taskState, String taskCode);      void deleteTaskByTaskCode(String taskCode);      Task findByTaskCode(String taskCode);  }

定义任务接口,解决并发问题,以及扩展支持集群环境

public interface ILockService {     void lock(String taskCode);     void unlock(String taskCode); }

定义事件监听器,用于监听任务的状态事件,可扩展状态监控,各种回调等

public interface IEventListener {     void listener(Event event); }

核心处理器,处理核心流程

  • 初始化加载所有IJob的实现 从Spring容器获取IJob实现类并解析Job注解

  • 添加任务threadPoolTaskScheduler.schedule(task,cron)

  • 更新任务详情

    • scheduledFuture.cancel(true)

    • threadPoolTaskScheduler.schedule(task,cron)

  • 启动任务 threadPoolTaskScheduler.schedule(task,cron)

  • 暂停任务 scheduledFuture.cancel(true)

  • 任务监控 TaskList

待实现功能

  • 重试补偿:失败重试。

  • failstore : 存储失败任务,供人肉补偿。

  • misfire:存储错过的任务,供人肉补偿。

自己在核心处理器中加下相应的增强功能逻辑即可。

使用示例

直接实现IJob接口并加上Job注解即可

@Job(taskCode = "job1", taskName = "laker测试任务",cron = "0/5 * * * * *") @Slf4j public class TestJob implements IJob {     @Override     public void execute(Map map) throws Exception {         log.info("laker job run");         TimeUnit.SECONDS.sleep(10);     } }

感谢各位的阅读,以上就是“如何搭建基于Spring Task实现动态管理任务”的内容了,经过本文的学习后,相信大家对如何搭建基于Spring Task实现动态管理任务这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何搭建基于Spring Task实现动态管理任务

本文链接: https://lsjlt.com/news/280360.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何搭建基于Spring Task实现动态管理任务
    这篇文章主要讲解了“如何搭建基于Spring Task实现动态管理任务”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何搭建基于Spring Task实现动态管理任务”吧!什么是定时任务定时...
    99+
    2023-06-15
  • Spring Task如何动态修改任务执行计划cron
    小编给大家分享一下Spring Task如何动态修改任务执行计划cron,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring Task 动态修改任务执行计划...
    99+
    2023-06-25
  • 如何使用spring-task定时任务动态配置修改执行时间
    小编给大家分享一下如何使用spring-task定时任务动态配置修改执行时间,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!spring-task定时任务动态配置修改执行时间因项目需要,几个定时任务需要人为动态设置执行时间,...
    99+
    2023-06-25
  • Spring源码如何实现动态代理
    小编给大家分享一下Spring源码如何实现动态代理,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!注:这里不阐述Spring和AOP的一些基本概念和用法,直接进入正题。流程  Spring所管理的对象大体会经过确定实例化对象...
    99+
    2023-06-14
  • SpringBoot动态定时任务如何实现
    这篇文章主要介绍了SpringBoot动态定时任务如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot动态定时任务如何实现文章都会有所收获,下面我们一起来看看吧。 执行定时任务的...
    99+
    2023-07-05
  • 如何实现基于input动态模糊查询
    这篇文章主要介绍了如何实现基于input动态模糊查询,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最近在用jQuery实现动态模糊查询的时候...
    99+
    2024-04-02
  • 基于JavaScript如何实现动态雨滴特效
    今天小编给大家分享一下基于JavaScript如何实现动态雨滴特效的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。演示技术栈介...
    99+
    2023-07-02
  • 一文搞懂如何实现Java,Spring动态启停定时任务
    目录为什么需要定时任务Java定时任务的原理Timer+TimerTaskScheduledThreadPoolExecutorTimer VS ScheduledThreadPoo...
    99+
    2024-04-02
  • Spring基于Aop实现事务管理流程详细讲解
    目录aop在spring事务中的运用基于纯注解实现spring事务管理基于xml文件实现Spring事务管理aop在spring事务中的运用 在Spring中,AOP和事务管理是两个...
    99+
    2023-05-20
    Spring Aop事务管理 Spring实现事务管理
  • 如何实现基于Quartz定时调度任务
    小编给大家分享一下如何实现基于Quartz定时调度任务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介Quarzt是一个项目中定时执行任务的开源项目,Quart...
    99+
    2023-05-30
    quartz
  • 如何在Spring框架中实现动态代理
    这篇文章给大家介绍如何在Spring框架中实现动态代理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。动态代理,是一种通过运行时操作字节码,以达到增强类的功能的技术,也是Spring AOP操作的基础,关于AOP的内容,...
    99+
    2023-05-31
    spring 动态代理
  • 用nodejs的实现原理和搭建服务器(动态)
    今天是我学习的Node.js的第二天,所谓的node.js其实它是javascript编写的服务器的语言,同时它又是属于后台的框架,是一个开放性的平台。 一、相关理论知识: 我们可以用requre来引入模块...
    99+
    2022-06-04
    原理 服务器 动态
  • 如何基于python实现银行管理系统
    这篇文章将为大家详细讲解有关如何基于python实现银行管理系统,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-14
  • 基于C++如何实现信息管理系统
    这篇“基于C++如何实现信息管理系统”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于C++如何实现信息管理系统”文章吧。使...
    99+
    2023-06-29
  • 基于C++如何实现职工管理系统
    这篇文章主要介绍了基于C++如何实现职工管理系统的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于C++如何实现职工管理系统文章都会有所收获,下面我们一起来看看吧。1、管理系统需求职工管理系统可以用来管理公司内...
    99+
    2023-06-30
  • 基于C#如何实现宿舍管理系统
    本篇内容主要讲解“基于C#如何实现宿舍管理系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于C#如何实现宿舍管理系统”吧!一、项目创建首先通过创建C#的Windows窗体应用程序,名字可以自...
    99+
    2023-07-02
  • 如何实现SpringBoot+Quartz+Maven+MySql动态定时任务
    下面一起来了解下如何实现SpringBoot+Quartz+Maven+MySql动态定时任务,相信大家看完肯定会受益匪浅,文字在精不在多,希望如何实现SpringBoot+Quartz+Maven+MyS...
    99+
    2024-04-02
  • SpringBoot基于AbstractRoutingDataSource如何实现多数据源动态切换
    本文小编为大家详细介绍“SpringBoot基于AbstractRoutingDataSource如何实现多数据源动态切换”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot基于AbstractRoutingDataSour...
    99+
    2023-06-30
  • 基于SpringBoot和Vue的动态语音播放如何实现
    这篇文章主要介绍“基于SpringBoot和Vue的动态语音播放如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于SpringBoot和Vue的动态语音播放如何实现”文章能帮助大家解决问题。...
    99+
    2023-07-06
  • Spring Boot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除
    一、整个 Quartz 的代码流程基本基本如下: 首先需要创建我们的任务(Job),比如取消订单、定时发送短信邮件之类的,这是我们的任务主体,也是写业务逻辑的地方。 创建任务调度器(Scheduler),这是用来调度任务的,主要用于启动...
    99+
    2023-09-10
    spring boot java spring Quartz Powered by 金山文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作