使用spring實現定時任務

@Service
public class SchedulerJob {

    private static final Logger logger = LoggerFactory.getLogger(SchedulerJob.class);

    private static final int POOL_SIZE = 20;
    private static final ScheduledExecutorService EXECUTOR = new ScheduledThreadPoolExecutor(POOL_SIZE,
            new ThreadFactoryBuilder().setNameFormat("job-pool-%d").build(),(r, executor) -> {
        logger.error("SchedulerJob.task reject");
    });

    private static final Map<String, ScheduledFuture<?>> SCHEDULED_MAP = new ConcurrentHashMap<>();

    /**
     * 使用cronExpression 任務將會在指定cronExpression的下個週期執行
     */
    public void test(String expression, Integer jobId, Integer status) {
    	// 校驗使用quartz-2.3.2.jar中的工具類CronExpression
        boolean validExpression = CronExpression.isValidExpression(expression);
        if (!validExpression) {
            logger.error("cron expression error, expression: {}", expression);
            return;
        }
        TaskScheduler scheduler = new ConcurrentTaskScheduler(EXECUTOR);
        Trigger trigger = new CronTrigger(expression, TimeZone.getTimeZone(ZoneId.systemDefault()));
        String key = expression + "-" + jobId;
        boolean exist = SCHEDULED_MAP.containsKey(key);
        if (exist) {
            // 任務已存在
            if (status == 1) {
                // 停止任務
                ScheduledFuture<?> scheduledFuture = SCHEDULED_MAP.get(key);
                scheduledFuture.cancel(false);
                if (scheduledFuture.isCancelled()) {
                    SCHEDULED_MAP.remove(key);
                    logger.info("任務已停止,jobKey:{}", key);
                }
            }
        } else {
            ScheduledFuture<?> schedule = scheduler.schedule(new FunTask(jobId), trigger);
            SCHEDULED_MAP.put(key, schedule);
        }
    }

    /**
     * 按給定週期執行-立即執行(單位秒)
     */
    public void test(long period, Integer jobId, Integer status) {
        TaskScheduler scheduler = new ConcurrentTaskScheduler(EXECUTOR);
        String key = period + "-" + jobId;
        boolean exist = SCHEDULED_MAP.containsKey(key);
        if (exist) {
            // 任務已存在
            if (status == 1) {
                // 停止任務
                ScheduledFuture<?> scheduledFuture = SCHEDULED_MAP.get(key);
                scheduledFuture.cancel(false);
                if (scheduledFuture.isCancelled()) {
                    SCHEDULED_MAP.remove(key);
                    logger.info("任務已停止,jobKey:{}", key);
                }
            }
        } else {
            ScheduledFuture<?> schedule = scheduler.scheduleAtFixedRate(new FunTask(jobId), period * 1000);
            SCHEDULED_MAP.put(key, schedule);
        }
    }


    private static class FunTask implements Runnable {
        private final Integer jobId;

        private FunTask(Integer jobId) {
            this.jobId = jobId;
        }

        @Override
        public void run() {
            logger.info("jobId:{},executor...", jobId);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章