SpringBoot Schedule 定时任务

转载https://blog.csdn.net/amelia__liu/article/details/81940315

创建定时任务

@Scheduled 注解用于标注这个方法是一个定时任务的方法,有多种配置可选。cron支持cron表达式,指定任务在特定时间执行;fixedRate以特定频率执行任务;fixedRateString以string的形式配置执行频率。

package com.autonavi.task.test;
import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.autonavi.task.ScheduledTasks;

@Component
public class ScheduledTest {

  private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);

  @Scheduled(cron="0 0/2 * * * ?")
  public void executeFileDownLoadTask() {

    // 间隔2分钟,执行任务  
    Thread current = Thread.currentThread();
   System.out.println("定时任务1:"+current.getId());
    logger.info("ScheduledTest.executeFileDownLoadTask 定时任务1:"+current.getId()+ ",name:"+current.getName());

  }

}

启动定时任务

@EnableScheduling 注解的作用是发现注解@Scheduled的任务并后台执行。

@SpringBootApplication
@EnableScheduling
public class App {
  private static final Logger logger = LoggerFactory.getLogger(App.class);
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);  
    logger.info("start");           
  } 
}

Springboot本身默认的执行方式是串行执行,也就是说无论有多少task,都是一个线程串行执行,并行需手动配置

并行任务

继承SchedulingConfigurer类并重写其方法即可,如下

@Configuration
//所有的定时任务都放在一个线程池中,定时任务启动时使用不同都线程。
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //设定一个长度15的定时任务线程池
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(20));
    }
}

异步并行任务

@Configuration
@EnableScheduling
@EnableAsync(
mode = AdviceMode.PROXY, proxyTargetClass = false,
order = Ordered.HIGHEST_PRECEDENCE
)

@ComponentScan(basePackages = "hello")
public class RootContextConfiguration implement sAsyncConfigurer, SchedulingConfigurer {

@Bean
public ThreadPoolTaskScheduler taskScheduler(){
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
scheduler.setThreadNamePrefix("task-");
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}

@Override
public Executor getAsyncExecutor()
{
Executor executor = this.taskScheduler();
return executor;
}

@Override
public void configureTasks(ScheduledTaskRegistrar registrar)
{
TaskScheduler scheduler = this.taskScheduler();
registrar.setTaskScheduler(scheduler);

}

}
Spring Boot 中集成 Redis 的定时任务主要是通过 Spring Cloud Config Server 和 Spring Batch 或者 Spring Schedule 实现的。Redis可以作为一个消息队列,用来存储定时任务的任务列表。 以下是简单的步骤: 1. 添加依赖:首先,在你的`pom.xml`文件中添加Spring Data Redis和Spring Batch或Quartz Scheduler的依赖。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 如果使用Spring Batch --> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-core</artifactId> </dependency> <!-- 或者如果使用Quartz Scheduler --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency> ``` 2. 配置Redis:在`application.properties`或`application.yml`中配置Redis连接信息。 ```properties spring.redis.host=localhost spring.redis.port=6379 ``` 3. 创建定时任务:如果你选择Spring Batch,你可以创建一个Job和Steps来执行特定的操作,然后将它们注册到一个Scheduler或CronTrigger中。如果是Quartz Scheduler,你需要编写JobDetail和Trigger,并注入到启动类或专门的服务中。 ```java @Configuration @EnableScheduling public class JobConfig { @Autowired private MyTask myTask; @Scheduled(cron = "0 0/5 * * * ?") // 每5分钟执行一次 public void executeTask() { myTask.run(); } } ``` 4. 使用Redis存储任务:为了支持定时任务,你可以将待执行的任务存入Redis,如使用List、Set或SortedSet数据结构,然后定期检查并处理这些任务。 ```java @Autowired private StringRedisTemplate stringRedisTemplate; public void scheduleTask(String taskId) { stringRedisTemplate.lpush("scheduled-tasks", taskId); } public void runScheduledTasks() { List<String> tasks = stringRedisTemplate.lrange("scheduled-tasks", 0, -1); // 获取所有待执行任务 for (String task : tasks) { // 执行任务逻辑... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值