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

 

写在最后

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

 相关推荐:

posted @ 2023-09-08 17:04  Marydon  阅读(494)  评论(0编辑  收藏  举报