spring 实现定时任务(手动配置,不用注解) 2025558编辑
Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注
资深码农+深耕理财=财富自由
欢迎关注

spring 实现定时任务(手动配置,不用注解)
Created by Marydon on 2023-09-08 17:04
1.情景展示
在java当中实现定时任务,主要有两种。
一种是通过java源码实现,另一种是通过spring框架来实现。
由于我们现在基本上使用的都是spring框架(SpringMVC、SpringBoot),况且,使用spring实现定时任务,代码更加简洁。
那么,如何是想spring来实现呢?
2.具体分析
使用spring实现,具体有两种。
一种是在spring框架中,手动配置定时任务;
另一种是使用注解。(SpringMVC和SpringBoot均可)
3.解决方案
由于本人的项目还是使用手动配置spring,所以,无法通过注解来实现。
只能进行手动配置。
手动配置定时任务
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd" > <description> <![CDATA[ 描述:远程医疗定时任务配置 版本:1.0 作者:Marydon 日期:2023年9月4日10:59:00 说明:定时任务需要注入的对象,可以在这个文件当中配置,也是配置到spring-ycyl-bo.xml当中 ]]> </description> <!-- 外检:定时任务类 --> <bean id="wjJobTasksBean" class="ycyl.web.jobs.WjJobTasks"> <property name="boWJ_CONSULT_INFO" ref="boWJ_CONSULT_INFO" /> <property name="boWJ_PATIENT_INFO" ref="boWJ_PATIENT_INFO" /> <property name="boWJ_PATIENT_DETAILINFO_RESULT" ref="boWJ_PATIENT_DETAILINFO_RESULT" /> </bean> <!-- 通过task标签,定义定时功能 在线Cron表达式生成器:https://cron.qqe2.com/ --> <task:scheduled-tasks> <!-- wjJobTasksBean对象的getReport方法 每10分钟执行一次:0 0/10 * * * ? --> <task:scheduled ref="wjJobTasksBean" method="getReport" cron="0 0/10 * * * ?"/> <!-- 要关闭定时任务,需将task:scheduled-tasks标签删掉 --> </task:scheduled-tasks> </beans>
说明:
为了方便对定时任务管理,我们可以把定时任务单独拉出来,搞成一个独立的XML文件。
xmlns="http://www.springframework.org/schema/beans"对应的值是:http://www.springframework.org/schema/beans和http://www.springframework.org/schema/beans/spring-beans.xsd
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"对应的是:xsi:schemaLocation
xmlns:task="http://www.springframework.org/schema/task"对应的值是: http://www.springframework.org/schema/task和http://www.springframework.org/schema/task/spring-task-3.0.xsd
以上信息,不能省略,必须引用到beans标签里面,否则,启动会报错。
然后,我们再把这个文件引入到spring核心文件当中即可。
WjJobTasks.java类的getReport()方法就是我需要定时执行的内容。
另外,就是通过手动配置的这种方式,会在项目启动的时候自动生效,不需要我们进行额外的操作。
4.SpringBoot定时任务
第一步:@EnableScheduling
方式一:在程序入口(启动类Application上)添加注解@EnableScheduling。
方式二:新建一个配置类。
import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling public class SchedulingConfig { // 这里无需添加任何方法,仅用于启用定时任务功能 }
第二步: @Scheduled(cron = "0 0/30 * * * ?")
在需要定时执行的方法体上添加注解@Scheduled,并设置cron表达式的值即可。
如何动态配置定时任务?
为了方便对定时任务进行管理,我们可以把cron表达式移至到配置文件当中。
另外就是,如果我们在tomcat上部署项目的话,如果后续需要修改定时任务的执行周期,我们就可以直接在配置文件中修改,而不需要更新class文件。
在 Spring Boot 应用程序的配置文件(通常是 application.properties 或 application.yml)中添加一个属性来存放定时任务的 cron 表达式。例如
Properties文件
task.cron=0 0/30 * * * ?
Yaml文件
task: cron: "0 0/30 * * * ?"
在java类当中直接使用el表达式获取
@Scheduled(cron = "${task.cron}") public void timerJob() { // 定时任务逻辑 System.out.println("定时任务执行"); }
如何配置定时任务永不执行?
在springboot项目当中,当我们按照上述操作设置定时任务后,项目一旦启动,定时任务就开始运行了。
像网络上说的cron="* * * * * *"无效,在springboot当中,它表示的含义是一直执行,而不是永不执行。
像网络上说的,给cron配置一个无效的表达式,也是不行的,在springboot项目启动时,会自动检测表达式的有效性。
那该如何配置定时任务在需要的时候生效,不需要的时候失效呢?
采用曲线救国策略。
我们可以在配置文件当中配置一个boolean值,用于管理定时任务是否真正执行我们实际所需代码。
task: #定时任务是否启用 enabled: false #定时任务运行周期 cron: "0 0/30 * * * ?"
实现定时任务根据配置文件中的开关状态(true/false)决定是否执行。
在定时任务真正执行的方法体内增加是否有效判断。
import org.springframework.beans.factory.annotation.Value; @Value("${task.enabled}") private boolean taskEnabled;
@Scheduled(cron = "${task.cron}") // 假设您已经按照前文配置了 cron 表达式 public void timerJob() { if (!taskEnabled) { return; // 如果任务未开启,则直接返回,不执行后续逻辑 } // 定时任务逻辑 System.out.println("定时任务执行"); }
在定时任务类中,通过 @Value 注解注入开关状态,并在定时任务方法内部检查该值。如果为 true,则执行任务逻辑;否则,直接返回。
与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。
您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!
↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/17688102.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2019-09-08 java 压缩图片(只缩小体积,不更改图片尺寸)
2019-09-08 js 压缩图片(只缩小体积,不更改图片尺寸)