spring 实现定时任务(手动配置,不用注解)
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