spring task使用

本文介绍如何在SpringBoot项目中使用@EnableScheduling注解启动定时任务,并通过Scheduled注解实现固定频率的任务执行,示例代码展示了如何创建定时更新Token的任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、启动类启动定时任务:在启动类上面加上@EnableScheduling即可开启定时

 @EnableScheduling
 @SpringBootApplication
public class TransferPass {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(TransferPassFlowQueryStart.class, args);
    }
}

2、创建定时任务实现类

@Component
public class TokenTask {
    @Autowired
    PropertiesReader propertiesReader;
    
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 9000000)
    public void updateToken() {
        propertiesReader.doRefreshToken();
        //System.out.println("[" + Thread.currentThread().getName() + "]" + "现在时间:" + dateFormat.format(new Date()));
    }

}

### 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、付费专栏及课程。

余额充值