ThreadPoolTaskScheduler的使用,定时任务开启与关闭

2023-01-08 13:26:58

这里用的是Springboot框架。进行测试开发的,其实都是一样的。只不过这样比较方便测试。

利用定时线程池任务调度,多利模式,

定点查询任务,开启或关闭简单案例,如果任务有需求,那么就拼接cron表达式,传入定时任务即可。


/**
 * @author: Licl
 **/
@Component
@Scope("prototype")
public class DynamicTask {

    private final static Logger logger = LoggerFactory.getLogger(DynamicTask.class);
    private String cron;
    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;
    private ScheduledFuture future;

    public void startCron() {
        cron = "0/1 * * * * ?";
        System.out.println(Thread.currentThread().getName());
        String name = Thread.currentThread().getName();
        future = threadPoolTaskScheduler.schedule(new myTask(name), new CronTrigger(cron));
        App.map.put(name, future);
    }

    public void stop() {
        if (future != null) {
            future.cancel(true);
        }
    }

    private class myTask implements Runnable {
        private String name;

        myTask(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            System.out.println("test" + name);
        }
    }

}

创建一个map用来存储定时任务的回调对象。用于接下来的判断。并且初始化调度的线程池

 

@SpringBootApplication
public class App {
    // 线程存储器
	public static ConcurrentHashMap<String, ScheduledFuture> map = new ConcurrentHashMap<String, ScheduledFuture>();
    // 启动入口
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}

    // 创建线程
	@Bean
	public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
		ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
		executor.setPoolSize(20);
		executor.setThreadNamePrefix("taskExecutor-");
		executor.setWaitForTasksToCompleteOnShutdown(true);
		executor.setAwaitTerminationSeconds(60);
		return executor;
	}

}

接下来进入测试方法,查看是否可以进行定时任务的定点停止。

设定一个线程名称,进行模拟。以后部署在项目中可以是动态的。

/**
 * @author: Licl
 * @Description: 测试类
 **/
@RestController
public class Test {

	@Autowired
	private DynamicTask task;
	@RequestMapping("/task")
	public void test() throws Exception {
	    // 开启定时任务,对象注解Scope是多利的。
		task.startCron();

	}
	@RequestMapping("/stop")
	public void stop() throws Exception {
	    // 提前测试用来测试线程1进行对比是否关闭。
        ScheduledFuture scheduledFuture = App.map.get("http-nio-8081-exec-1");
        scheduledFuture.cancel(true);
        // 查看任务是否在正常执行之前结束,正常true
        boolean cancelled = scheduledFuture.isCancelled();
        while (!cancelled) {
            scheduledFuture.cancel(true);
        }
    }
}

 

方法调用分析。测试log

  • 作者:缘来是你阿
  • 原文链接:https://blog.csdn.net/qq_32711309/article/details/84944534
    更新时间:2023-01-08 13:26:58