Spring 自带定时任务Schedule

1) Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。 最早的时候就是这样写定时任务的。

2) 开源的第三方框架: Quartz 或者 elastic-job , 但是这个比较复杂和重量级,适用于分布式场景下的定时任务,可以根据需要多实例部署定时任务。

3) 使用Spring提供的注解: @Schedule 。 如果定时任务执行时间较短,并且比较单一,可以使用这个注解。【转载】

 实现定时任务的开启和关闭以及定时任务时间的修改

package com.uniview.ccm.gps.rocketmq.utils;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

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

/**
 * @author sunzhengtao
 *         定时器工具类
 */
@Slf4j
@Component
public class ScheduleUtil {

    private final static Map<String, Task> TASK_MAP = new HashMap<>();

    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    @Autowired
    public void setThreadPoolTaskScheduler() {
        this.threadPoolTaskScheduler = threadPoolTaskScheduler();
    }

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        return new ThreadPoolTaskScheduler();
    }

    /**
     * 创建定时任务
     *
     * @param id 任务ID
     * @return 返回值
     */
    public String start(String id) {
        if (StringUtils.isNotEmpty(id) && !TASK_MAP.containsKey(id)) {
            Task task = new Task(id);
            ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(task.getRunnable(),
                    triggerContext -> new CronTrigger(task.getCron())
                            .nextExecutionTime(triggerContext)
            );
            task.setScheduledFuture(future);
            TASK_MAP.put(task.getTaskId(), task);
        }
        log.info("创建定时任务成功");
        return "success";
    }

    /**
     * 更新定时任务
     *
     * @param cron 定时任务
     * @param id   任务ID
     * @return 返回值
     */
    public String update(String cron, String id) {
        if (TASK_MAP.containsKey(id)) {
            Task task = TASK_MAP.get(id);
            ScheduledFuture<?> future = null;
            try {
                future = threadPoolTaskScheduler.schedule(task.getRunnable(),
                        triggerContext -> new CronTrigger(cron).nextExecutionTime(triggerContext)
                );
            } catch (Exception e) {
                log.error("更新定时任务失败" + e.getMessage(), e);
                return "error";
            }
            task.getScheduledFuture().cancel(true);
            task.setScheduledFuture(future);
        }
        log.info("更新定时任务成功");
        return "success";
    }

    /**
     * 删除定时任务
     *
     * @param id 任务ID
     * @return 返回值
     */
    public String stop(String id) {
        if (TASK_MAP.containsKey(id)) {
            Task task = TASK_MAP.get(id);
            task.getScheduledFuture().cancel(true);
            TASK_MAP.remove(id);
        }
        log.info("删除定时任务成功");
        return "success";
    }

    @Data
    private static class Task {
        private String taskId;
        private Runnable runnable;
        private ScheduledFuture scheduledFuture;
        private String cron;

        private Task(String taskId) {
            this.taskId = taskId;
            runnable = () -> {
                log.info("任务taskId: " + taskId);
            };
            cron = "0/15 * * * * ?";
            log.info("默认定时时间每个15s执行一次");
        }
    }

}

猜你喜欢

转载自blog.csdn.net/sunzhengtaolz/article/details/86487741