spring 동적 정시 작업

3598 단어 spring
spring 의 Thread PoolTask Scheduler 정시 스 레 드 풀 을 사용 합 니 다.다음 과 같은 네 가지 방법 으로 정시 작업 을 발표 합 니 다.
1.schedule(Runnable task,Date stateTime),지 정 된 시간 에 한 번 의 정시 작업 수행
2.schedule(Runnable task,Trigger trigger),지정 한 표현 식 cron 을 동적 으로 만 드 는 정시 작업
3.scheduleAtFixed Rate(Runnable task,Date startTime,long period),지 정 된 시간 부터 지 정 된 간격(밀리초 단위)으로 한 번 의 작업 을 수행 합 니 다.간격 은 이전 실행 부터 다음 작업 시작 시간 까지 입 니 다.
4. scheduleAtFixed Rate(Runnable task,long period),지금부터 지정 한 간격(밀리초 단위)으로 작업 을 수행 합 니 다.간격 은 이전 실행 부터 다음 작업 시작 시간 까지 입 니 다.
5.schedule With FixedDelay(Runnable task,Date startTime,long delay)는 지 정 된 시간 부터 지 정 된 간격(밀리초 단위)으로 한 번 의 임 무 를 수행 하 며,간격 은 이전 수행 완료 에서 다음 작업 시작 시간 까지 입 니 다.
6.schedule With Fixed Delay(Runnable task,Duration delay),지금부터 지 정 된 간격(밀리초 단위)으로 한 번 의 작업 을 수행 합 니 다.다음 작업 시작 시간 까지 간격 을 두 고 다음 작업 을 수행 합 니 다.
schedule(Runnable task,Trigger trigger)을 사용 하여 cron 표현 식 으로 작업 을 발표 합 니 다.
우선 Thread PoolTask Scheduler 를 bean 으로 spring 에 주입 합 니 다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

/**
 * bean   
 * @author: yuhh
 * @create: 2019-06-25 13:50
 **/
@Configuration
public class BeanConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
        //      
        executor.setPoolSize(Runtime.getRuntime().availableProcessors());
        //                        
        executor.setThreadNamePrefix("charge-task-Executor-");
        //                             Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //                  ,                  ,            ,      
        executor.setAwaitTerminationSeconds(60);
        return executor;
    }
}

그 다음 에 정시 작업 클래스 에 Thread PoolTask Scheduler 를 주입 합 니 다.정시 작업 을 한 번 수행 한 후에 닫 으 려 면 모든 정시 작업 의 Future 를 저장 하 는 map 가 필요 합 니 다.Future 는 스 레 드 를 닫 을 수 있 습 니 다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;

/**
 *      
 * @author: yuhh
 * @create: 2019-05-13 11:39
 **/
@Component
public class SchedulingTask {

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    /**
     *           ,        
     */
    private Map futureMap = new HashMap<>();

    /**
     *             
     * @author yuhh
     * @date 2019/5/13 14:39
     */
    @Scheduled(cron = "0 10 0 * * ?")
    public void settleAccounts(){
        futureMap.put(
                mapKey,
                threadPoolTaskScheduler.schedule(
                        new MyRunnable(),
                        new CronTrigger(cron   )
                )
        )
    }


    /**
     *    --      
     */
    private class MyRunnable implements Runnable {

        @Override
        public void run() {
           //     
            todo
            //             
            ScheduledFuture future = futureMap.get(mapKey);
            future.cancel(true);
        }
    }
}

상기 코드 는 주어진 cron 표현 식 의 동적 설정 에 따라 시간 임 무 를 설정 하고 실행 이 끝 난 후에 이 시간 임 무 를 닫 을 수 있 습 니 다.

좋은 웹페이지 즐겨찾기