Spring Task的简单使用

Spring Task的简单使用

下面我是使用注解的方式使用Task设计一个简单的定时器,在凌晨0点0分0秒操作数据库。

步骤:

  1. 开启组件扫描
  2. 开启定时任务的注解支持
  3. 定义定时器类
<context:component-scan base-package="com.timer"/>
<!--  开启定时任务的注解支持 -->
<task:annotation-driven />

注意:在配置文件上要加上如下的代码

<beans 
	xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="
        ...
        http://www.springframework.org/schema/task 
        http://www.springframework.org/schema/task/spring-task.xsd">
@Component
public class DemoTask {
	@Autowired
	private DemoService demoService;

	/**
	 * 每天凌晨0分0秒执行
	 */
	@Scheduled(cron = "0 0 0 * * ?")
	public void scheduledTask(){
		demoService.insert();
	}
	
}

cron表达式:
注意: Spring Task的cron只支持前6部分,不支持第七个年份。
在这里插入图片描述
在这里插入图片描述

### Spring Task 使用指南 #### 1. Spring Task 基本概念 Spring Task 是一种轻量级的任务调度框架,支持通过简单的注解或 XML 配置来实现定时任务的功能。它主要依赖于 `@Scheduled` 和 `ThreadPoolTaskScheduler` 来完成任务的计划和执行。 --- #### 2. 示例代码:基本配置与使用方法 以下是基于注解方式的一个简单示例: ```java // 启用 Scheduled 支持 @SpringBootApplication @EnableScheduling public class TaskApplication { public static void main(String[] args) { SpringApplication.run(TaskApplication.class, args); } } ``` 定义一个带有 `@Scheduled` 注解的方法: ```java @Component public class MyTask { @Scheduled(cron = "0/5 * * * * ?") // 每隔 5 秒钟执行一次 public void performTask() { System.out.println("当前时间:" + LocalDateTime.now()); } @Scheduled(fixedRate = 10000) // 每隔 10 秒钟执行一次 public void fixedRateTask() { System.out.println("Fixed Rate Task 执行时间:" + LocalDateTime.now()); } } ``` --- #### 3. 高级功能:动态修改 Cron 表达式 如果需要在运行时动态更改任务的时间安排,则可以借助 `ThreadPoolTaskScheduler` 实现[^3]。下面是一个完整的例子: ```java @Service public class DynamicTaskService { @Autowired private ThreadPoolTaskScheduler taskScheduler; private final AtomicReference<ScheduledFuture<?>> scheduledFutureRef = new AtomicReference<>(); public void startDynamicTask() { stopDynamicTask(); scheduledFutureRef.set( taskScheduler.schedule(() -> System.out.println("动态任务执行时间:" + LocalDateTime.now()), new CronTrigger("*/5 * * * * ?"))); // 初始设置每 5 秒触发一次 } public void changeCronExpression(String cronExpr) { stopDynamicTask(); scheduledFutureRef.set( taskScheduler.schedule(() -> System.out.println("更新后的动态任务执行时间:" + LocalDateTime.now()), new CronTrigger(cronExpr))); } public void stopDynamicTask() { ScheduledFuture<?> future = scheduledFutureRef.getAndSet(null); if (future != null && !future.isDone()) { future.cancel(true); } } } ``` 调用该服务类中的方法即可控制任务启动、停止以及动态调整 Cron 表达式。 --- #### 4. 配置说明 为了使 Spring Task 正常工作,通常需要在项目的 `application.properties` 或 `application.yml` 文件中进行一些必要的配置。 ##### (1)启用线程池 默认情况下,Spring Task 使用单一线程处理所有任务。可以通过如下配置增加并发能力[^3]: ```properties spring.task.scheduling.pool.size=5 ``` 这表示最多允许同时运行 5 个任务。 ##### (2)自定义线程池(可选) 对于更复杂的场景,可能需要完全掌控线程池的行为。此时可通过 Java Bean 定义自己的 `TaskScheduler` 实例: ```java @Configuration public class SchedulerConfig { @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(10); // 设置线程池大小为 10 scheduler.setThreadNamePrefix("task-scheduler-"); return scheduler; } } ``` --- #### 5. 注意事项 - **重复执行问题** 如果发现某些任务被多次执行,请检查是否存在多个应用实例部署的情况。分布式环境下建议引入 Redis 或数据库锁机制防止冲突[^3]。 - **Cron 表达式的正确性** 确保提供的 Cron 表达式语法无误,并且符合预期行为。推荐在线工具验证其合法性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值