面对一些小的功能需求点,如果需要非常灵活的进行处理定时任务处理,但是又因为你的需求需要使用到页面进行定时任务配置,显然使用Spring注解定时任务,无法满足你,这时你想到了xxl-job 或者 quezy等定时任务框架,但是过于繁琐,可能成本较大。那么本文将要解决你的问题。
ThreadPoolTaskScheduler 内部方法非常丰富,本文实现的是一种corn表达式,周期执行
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@Configuration
public class TaskConfig {//配置定时任务线程池-自定义名称避免冲突@Bean(name = "myThreadPoolTaskScheduler")public ThreadPoolTaskScheduler threadPoolTaskScheduler() {ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();executor.setPoolSize(2);executor.setThreadNamePrefix("task-");executor.setWaitForTasksToCompleteOnShutdown(true);executor.setAwaitTerminationSeconds(60);return executor;}}
代码如下(示例):
@Slf4j
public class RunSameThing implements Runnable{@Overridepublic void run() {log.info("===我执行了===");}
}
import java.util.concurrent.ScheduledFuture;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;@Service
@Slf4j
public class CommonTask {@Resource(name = "myThreadPoolTaskScheduler")private ThreadPoolTaskScheduler taskScheduler;private ScheduledFuture future;//开启任务public void startTask(){//每次调用前,可执行一次关闭之前的stop();//每秒执行-corn 表达式可传参形式String cron = "0/1 * * * * ?";//RunSameThing 为执行的业务逻辑future = taskScheduler.schedule(new RunSameThing(), new CronTrigger(cron));}//关闭任务public void stop() {if (future != null) {log.info("我关闭了");future.cancel(true);}}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/task")
public class TestTaskController {@Autowiredprivate CommonTask commonTask;@RequestMapping("start")public void startTask(){commonTask.startTask();}@RequestMapping("end")public void endTask(){commonTask.stop();}}
task-1] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-2] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-2] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-2] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-1] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
task-2] com.easy.wheel.scheduler.RunSameThing : ===我执行了===
[nio-8080-exec-2] com.easy.wheel.scheduler.CommonTask : 我关闭了
线程池配置的两个线程,可以看到task-1 和 task-2 交替支持,达到了我们想要的效果,关闭也能正常进行关闭,nice。这个轮子搞定了,下次写代码直接复制。巴适
生活不能止步不前,为了更多的时间陪陪家人,轮子用起来啊,亲