spring @Scheduled定时任务使用说明及基本工作原理介绍

Posted gc65

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring @Scheduled定时任务使用说明及基本工作原理介绍相关的知识,希望对你有一定的参考价值。

使用说明及工作原理:

package com.example.spring.async;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import com.example.spring.MyLog;
/**
 * 定时任务使用示例
 *  1.启动类增加注解 @EnableScheduling
 *  2.相应类声明为服务 @Service
 *  3.方法上面增加 @Scheduled, 指定不同的参数以不同的方式运行定时任务
 * 备注:
 *  @Scheduled中参数解释:
 *      fixedRate:表示以固定的时间间隔执行(上次开始执行和本次开始执行之间的时间间隔),不关注被执行方法实际的执行时间
 *      fixedDelay:表示以固定的延迟执行(上次执行结束和本次开始执行的时间间隔),受被执行方法执行时间的影响
 *      cron="2 * * * * *": cron表达式配置执行方法。总共6位,分别代表 秒 分 时 日 月 周
 *  spring底层执行器:(默认使用的是单线程线程池)
 *      this.localExecutor = Executors.newSingleThreadScheduledExecutor();
 *      this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
 *  加载流程:
 *      ScheduledAnnotationBeanPostProcessor -> ScheduledTaskRegistrar -> afterPropertiesSet()
 *  @Scheduled 的方法必须是空返回值和无参方法,直接调用这个方法是同步的
 * @DESC 
 * @author guchuang
 *
 */
@Service
public class ScheduleMethod 
    
    public ScheduleMethod() 
        MyLog.info("-----------------------ScheduleMethod init--------------------------");
    
    /*@Scheduled(fixedRate=2000)
    public void foo1() 
        MyLog.info("每2秒执行一次,不管上次执行完成时间,fixedRate=2000");
    
    
    @Scheduled(fixedDelay=2000)
    public void foo2() 
        MyLog.info("上次执行完成,2s后执行,以此递推,fixedDelay=2000");
    */
    
    @Scheduled(fixedRate=2000)
    public void foo3() 
        MyLog.info("每2秒执行一次,不管上次执行完成时间,fixedRate=2000");
        MyLog.sleep(1000);
    
    
    /*@Scheduled(fixedDelay=10000)
    public void foo4() 
        //MyLog.info("上次执行完成,2s后执行,以此递推,fixedDelay=3000");
        MyLog.info("上次执行完成,2s后执行,以此递推,fixedDelay=3000 ----start");
        MyLog.sleep(1000);
        MyLog.info("上次执行完成,2s后执行,以此递推,fixedDelay=3000 ----end");
    */
    
    @Scheduled(cron="*/2 * * * * *")
    public void foo5() 
        MyLog.info("cron test--每隔两秒执行一次");
    

配置类:

package com.example.spring.async.config;

import java.util.concurrent.Executors;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import com.example.spring.MyThreadFactory;

@Configuration
public class ScheduleConfig implements SchedulingConfigurer
    
    /**
     * 向spring容器注入TaskScheduler线程池,用于执行@Scheduled注解标注的方法.
     * 类型为TaskScheduler.class, name为taskExecutor1的bean(使用类型注入spring,不是bean name)
     * 如果没有注入TaskScheduler或者ScheduledExecutorService,则默认使用单线程的线程池作为底层支撑
     * @return TaskScheduler 实例
     */
    @Bean
    public TaskScheduler taskExecutor() 
        return new ConcurrentTaskScheduler(Executors.newScheduledThreadPool(3, new MyThreadFactory("scheduled")));
    
    
    @Bean
    @Qualifier("test-123")
    public TaskScheduler taskExecutor2() 
        return new ConcurrentTaskScheduler(Executors.newScheduledThreadPool(3, new MyThreadFactory("scheduled2")));
    

    /**
     * 可以用于执行定时任务,设置taskScheduler等
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) 
        //taskRegistrar.setScheduler(taskExecutor1());      用于显示的设置线程池执行器
        taskRegistrar.addFixedDelayTask(() -> System.out.println("SchedulingConfigurer test"), 5000);
    
    

测试类

package com.example.spring.async;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.example.spring.BaseDemoApplicationTest;
import com.example.spring.MyLog;
import com.example.spring.async.ScheduleMethod;

public class ScheduleMethodTest extends BaseDemoApplicationTest 

    @Autowired
    ScheduleMethod schedule;
    
    @BeforeClass
    public static void setUpBeforeClass() throws Exception 
    

    @Before
    public void setUp() throws Exception 
    

    @Test
    public void test() 
        MyLog.sleep(1000 * 30);
    

 

以上是关于spring @Scheduled定时任务使用说明及基本工作原理介绍的主要内容,如果未能解决你的问题,请参考以下文章

sae中使用 spring Scheduled 定时任务 怎么弄

使用spring提供的@Scheduled注解创建定时任务

使用轻量级Spring @Scheduled注解执行定时任务

在Spring项目中使用@Scheduled注解定义简单定时任务

Spring boot实现定时任务二:使用注解@scheduled和@EnableScheduling

spring定时任务Scheduled与定时任务线程池配置SchedulingConfigurer ,Java