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,则执行任务逻辑;否则,直接返回。

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。

您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!

↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓

posted @   Marydon  阅读(558)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
历史上的今天:
2019-09-08 java 压缩图片(只缩小体积,不更改图片尺寸)
2019-09-08 js 压缩图片(只缩小体积,不更改图片尺寸)
点击右上角即可分享
微信分享提示
sorry,本博客所有代码禁止复制,原创代码需扫码支付方可获取!
关闭

1、先加好友再付费,点我加好友;

2、代码不能满足你的需求?加好友付费定制你的专属代码!

3、付费标准及方式,点我查看详情。