自定义的定时任务服务 ScheduledTaskService
package com.joyupx.service.impl.task; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.config.ScheduledTask; import org.springframework.scheduling.config.Task; import org.springframework.scheduling.support.CronTrigger; import org.springframework.scheduling.support.ScheduledMethodRunnable; import org.springframework.stereotype.Service; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ScheduledFuture; /** * 定制任务服务 * * @author hapday * @since 1.0 */ @Slf4j @Service public class ScheduledTaskService { // 线程池任务调度器 private final ThreadPoolTaskScheduler threadPoolTaskScheduler; // 声明【定制任务未来】引用 private ScheduledFuture<?> scheduledFuture; // 定时注解豆发送处理器 @Autowired private ScheduledAnnotationBeanPostProcessor scheduledAnnotationBeanPostProcessor; public ScheduledTaskService(ThreadPoolTaskScheduler taskScheduler) { this.threadPoolTaskScheduler = taskScheduler; } // @Scheduled ( fixedRate = 1000) // 如果用注解,则 startTask 方法和 stopTask 方法将失效,因为它的优先级高于手动启动的优先级 public void scheduleTask() { // 你的任务逻辑 log.info("\n\n\t\t\t》》》运行定时任务《《《\n\n"); } /** * 启动任务 */ public void startTask() { // 创建【任务的触发器】对象 Trigger taskTrigger = new CronTrigger("*/1 * * * * *"); // 周期性执行,比如这里设置为了 1 秒中执行一次 // trigger = new PeriodicTrigger(1000); // 立即启动 // future = taskScheduler.schedule(this::scheduleTask, new Date()); scheduledFuture = threadPoolTaskScheduler.schedule(this::scheduleTask, taskTrigger); } /** * 停止任务 */ public void stopTask() { if (null != scheduledFuture) { // 通过未来对象取消任务的执行。 scheduledFuture.cancel(false); } } /** * 查询运行中的任务 * * @return 任务集 */ public Set<String> runningTaskList() { /* * 无法获取到非注解启动的定时任务 * 只能获取到通过注解启动的任务 */ Set<ScheduledTask> scheduledTasks = scheduledAnnotationBeanPostProcessor.getScheduledTasks(); Set<String> runningTaskSet = new HashSet<>(scheduledTasks.size()); for (ScheduledTask scheduledTask : scheduledTasks) { // 获取任务 Task task = scheduledTask.getTask(); // 获取可运行的任务 Runnable runnableTemp = task.getRunnable(); // 声明【定时方法可运行】引用 ScheduledMethodRunnable scheduledMethodRunnable = null; /* * 排除非定时方法的可运行任务 */ if (runnableTemp instanceof ScheduledMethodRunnable) scheduledMethodRunnable = (ScheduledMethodRunnable) runnableTemp; /* * 排除空对象 */ if (null == scheduledMethodRunnable) { continue; } Object taskFullyQualifiedName = scheduledMethodRunnable.getTarget(); log.debug("\n\n######### Running task:{}", taskFullyQualifiedName); // 将task所关联的对象放到Set中(就是带@Scheduled方法的类) runningTaskSet.add(taskFullyQualifiedName.toString()); } return runningTaskSet; } }
标签:springframework,任务,org,scheduling,import,定制,public,ScheduledTaskService From: https://www.cnblogs.com/hapday/p/18380672