springboot 定时任务@Scheduled 和 异步@Async

使用@EnableScheduling开启功能

@Configuration
@EnableScheduling
public class ScheduleConfig {
   

}

编写任务

@Component
public class ScheduledTasks {
   
    
     //表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
     @Scheduled(fixedDelay = 500)
     public void fixedDelay(){
   
        
     }
     
     //表示按一定的频率执行任务,参数类型为long,单位ms;
     @Scheduled(fixedRate = 500)
     public void fixedRate(){
   
      
     }
  
     //cron表达式,指定任务在特定时间执行;
     @Scheduled(cron="0 50 * * * ?")
     public void cron(){
   
        
     }
     
     //第一次1秒后执行,当执行完后2秒再执行
     @Scheduled(initialDelay = 1000, fixedDelay = 2000)
     public void initialDelay() {
   

     }
     
     // 可以从配置文件中读取
     @Scheduled(fixedDelayString = "${jobs.fixedDelay}")
     public void fixedDelayString() {
   

     }

     
     /**
       * cron:cron表达式,指定任务在特定时间执行;
       * fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
       * fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
       * fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
       * fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
       * initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
       * initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
 	  */	
 }

 

配置(可选)

@Configuration
public class ScheduleConfig implements SchedulingConfigurer, AsyncConfigurer{
   
   
    //并行任务
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
   
        TaskScheduler taskScheduler = taskScheduler();
        taskRegistrar.setTaskScheduler(taskScheduler);
    }

    
    //并行任务使用策略:多线程处理(配置线程数等)
    @Bean
    public ThreadPoolTaskScheduler taskScheduler(){
   
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(20);
        scheduler.setThreadNamePrefix("task-");  //设置线程名开头
        scheduler.setAwaitTerminationSeconds(60);
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        return scheduler;
    }

    //异步任务
    public Executor getAsyncExecutor(){
   
        Executor executor = taskScheduler();
        return executor;
    }

    //异步任务 异常处理
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler(){
   
    	return new SimpleAsyncUncaughtExceptionHandler();
    }
}

定时任务线程池中,不管配置多少个线程,每次到定时点,只有一个线程去执行任务。假如配置fixedDelay=500,表示上一次任务执行完后,延迟500毫秒执行下次任务。如果任务执行需要500毫秒,那么任务的执行周期是500+500=1000毫秒。就算线程池中有多个线程,也会等那个任务执行完再选取一个线程再次执行任务。

@Bean("aaa")
public TaskScheduler  scheduler() {
   
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setThreadNamePrefix("a");
    scheduler.setPoolSize(4);
    scheduler.initialize();
    return scheduler;
}


@Scheduled(fixedDelay = 500)
public void scheduled(){
   
    try {
   
        Thread.sleep(500);
    } catch (InterruptedException e) {
   
        e.printStackTrace();
    }
    LOGGER.info(Thread.currentThread().getName());
}

2018-10-11 10:18:44.705     com.demo.test.async.ScheduleService      : a1
2018-10-11 10:18:45.710     com.demo.test.async.ScheduleService      : a1
2018-10-
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot中,可以使用@Scheduled注解来实现定时任务,可以结合@Async注解来实现多线程异步。 首先,需要在启动类上添加@EnableAsync注解,开启异步支持。然后在要执行异步任务的方法上添加@Async注解。 接下来,可以使用Java中的Executor框架来创建线程池,用于执行异步任务。可以在应用程序中创建一个线程池,并使用@Async注解将任务提交给线程池执行。 下面是一个示例代码: ```java @Configuration @EnableAsync public class AsyncConfig { @Bean(name = "taskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(20); executor.setQueueCapacity(30); executor.setThreadNamePrefix("MyAsyncThread-"); executor.initialize(); return executor; } } @Service public class MyService { @Async("taskExecutor") @Scheduled(cron = "0 0 12 * * ?") //每天中午12点执行 public void myAsyncTask() { //异步任务内容 } } ``` 在上面的示例中,我们创建了一个名为“taskExecutor”的线程池,并将其注入到MyService中的myAsyncTask方法中。该方法使用@Async注解来指示它应该在异步线程中执行。@Scheduled注解指定了任务执行的时间。 需要注意的是,@Async注解只有在调用该方法的类通过Spring容器进行管理时才会生效。如果通过new关键字手动创建对象,@Async注解将不起作用。 希望这可以帮助你完成Spring Boot定时任务整合多线程异步的实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值