spring动态加载时间表达式并生成定时任务

来源:互联网 发布:网络协议教程 pdf 编辑:程序博客网 时间:2024/05/17 14:19

定时调度管理类:

@Componentpublic class ScheduledTaskManager {    Logger logger = LoggerFactory.getLogger(getClass());    private static Map<String, ScheduledFuture<?>> scheduleFutureMap = ScheduledProcessPool.INSTANCE.getPool();    @Autowired    private ThreadPoolTaskScheduler threadPoolTaskScheduler;    @Autowired    private FuturesOrderService futuresOrderService;    private ScheduledFuture<?> schedule;    @Bean    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {        return new ThreadPoolTaskScheduler();    }    /**     * 描述:新增任务调度     *     * @param key         定时任务key     * @param cron        时间表达式     */    public void addScheduled(String key, String cron) {        //移除key的任务调度        removeScheduled(key);        //新增任务调度        schedule = threadPoolTaskScheduler.schedule(() -> {            //此处进行定时调度的业务操作                    }, new CronTrigger(cron));        if (schedule != null) {            scheduleFutureMap.put(key, schedule);        }    }    /**     * 描述:移除任务调度     *     * @param key 定时任务key     */    public void removeScheduled(String key) {        //先取消任务调度        ScheduledFuture<?> future = scheduleFutureMap.get(key);        if (future != null && !future.isDone()) {            future.cancel(true);        }        //并将任务调度从map中移除        if (scheduleFutureMap.containsKey(key)) {            Iterator<String> it = scheduleFutureMap.keySet().iterator();            while (it.hasNext()) {                if (it.next().equals(key)) {                    it.remove();                    break;                }            }        }    }}

定时调度池:

public enum ScheduledProcessPool {    INSTANCE;    private Map<String, ScheduledFuture<?>> scheduledPool;    /**     * 调度池初始容量     */    private int initialCapacity = 50;    private ScheduledProcessPool() {        scheduledPool = new ConcurrentHashMap<String, ScheduledFuture<?>>(initialCapacity);    }    /**     * Description: 获取任务调度池     */    public Map<String, ScheduledFuture<?>> getPool() {        return scheduledPool;    }}

在需要动态生成定时调度任务的代码中,注入定时调度管理类,并调用其addScheduled()方法,传入调度池的key与定时调度时间表达式cron即可

阅读全文
0 0
原创粉丝点击