SpringBoot Schedule 구성 상세 정보

5188 단어 springbootschedule
1. 정시 임무 실현 방식
정시 작업 실현 방식:
  • 자바 자체의 자바.util.Timer 클래스, 이 클래스는java를 조정할 수 있습니다.util.TimerTask 작업.이런 방식을 사용하면 프로그램이 특정한 주파수에 따라 실행될 수 있지만, 지정된 시간에 실행할 수 없다.일반적으로 쓰는 것이 비교적 적으니, 이 글은 상세한 소개를 하지 않을 것이다
  • Quartz를 사용합니다. 이것은 기능이 비교적 강한 스케줄러입니다. 프로그램이 지정된 시간에 실행할 수도 있고 특정한 주파수에 따라 실행할 수도 있습니다. 설정이 좀 복잡하고 틈틈이 소개합니다
  • SpringBoot이 자체로 가지고 있는 Scheduled는 그것을 경량급의 Quartz로 볼 수 있고 사용하기에 Quartz보다 훨씬 간단하다. 본고는 주로 소개한다
  • 정시 작업 수행 방식:
  • 단일 스레드(직렬)
  • 다중 스레드(병렬)
  • 2. 정시 작업 만들기
    
    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());
    
      }
    
    } 
    
    
    @Scheduled 메모는 이 메서드를 표시하는 데 사용되는 시간을 정하는 방법입니다. 여러 가지 설정이 선택할 수 있습니다.cron은cron 표현식을 지원하며 특정 시간에 작업을 수행하도록 지정합니다.fixedRate는 특정 주파수로 작업을 수행합니다.fixedRateString은 실행 빈도를 string 형식으로 구성합니다.
    3. 정시 작업 시작
    
    @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");            
    
      }  
    
    } 
    
    여기서 @EnableScheduling 메모는 @Scheduled 메모의 작업을 발견하고 백그라운드에서 수행하는 역할을 합니다.
    Springboot 자체의 기본 실행 방식은 직렬 실행입니다. 즉, 몇 개의 task가 있든지 간에 하나의 라인 직렬 실행입니다. 병렬은 수동으로 설정해야 합니다.
    4. 병렬 작업
    SchedulingConfigurer 클래스를 상속하고 다음 방법을 다시 작성하면 됩니다.
    
    @Configuration
    
    @EnableScheduling
    
    public class ScheduleConfig implements SchedulingConfigurer {
    
      @Override
    
      public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    
        taskRegistrar.setScheduler(taskExecutor());
    
      } 
    
      @Bean(destroyMethod="shutdown")
    
      public Executor taskExecutor() {
    
        return Executors.newScheduledThreadPool(100);
    
      }
    
    } 
    
    다시 실행하기 전의 그 데모는 이미 병행 실행되었다는 것을 흔쾌히 발견할 것이다!   
    5. 비동기식 병렬 작업
    
    import org.springframework.scheduling.TaskScheduler;
    
    import org.springframework.scheduling.annotation.AsyncConfigurer;
    
    import org.springframework.scheduling.annotation.EnableAsync;
    
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    
     
    
    @Configuration
    
    @EnableScheduling
    
    @EnableAsync(
    
    mode = AdviceMode.PROXY, proxyTargetClass = false,
    
    order = Ordered.HIGHEST_PRECEDENCE
    
    )
    
    @ComponentScan(
    
    basePackages = "hello"
    
    )
    
    public class RootContextConfiguration implements
    
    AsyncConfigurer, 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);
    
    }
    
    } 
    
    
    시작하는 main 메서드에 추가 구성을 추가합니다.
    
    @SpringBootApplication
    
    public class Application { 
    
      public static void main(String[] args) throws Exception {
    
       AnnotationConfigApplicationContext rootContext =
    
       new AnnotationConfigApplicationContext();
    
     
    
      rootContext.register(RootContextConfiguration.class);
    
      rootContext.refresh();
    
      }
    
    } 
    
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기