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);

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值