boot定时任务开启和关闭 spring_SpringBoot 动态操作定时任务(启动、停止、变更执行周期)...

1.什么是Future类型?

Future是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果的接口。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。

它的接口定义如下:

public interface Future {

boolean cancel(boolean mayInterruptIfRunning);

boolean isCancelled();

boolean isDone();

V get() throws InterruptedException, ExecutionException;

V get(long timeout, TimeUnit unit)

throws InterruptedException, ExecutionException, TimeoutException;

}

2. 它声明这样的五个方法:

cancel方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。

isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。

isDone方法表示任务是否已经完成,若任务完成,则返回true;

get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

3.也就是说Future提供了三种功能:

判断任务是否完成

能够中断任务

能够获取任务执行结果

4.案例

4.1 编写动态Task类,主要实现通过URL控制任何的添加修改等等。

package com.example.power_spider.controller;

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 org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import com.example.power_spider.utils.SchedulingRunnable;

import java.util.concurrent.ScheduledFuture;

import java.util.concurrent.TimeUnit;

/**

* @author Mr.Hao

* @date 2020-03-27

*/

@RestController

@Component

public class DynamicTaskController {

@Autowired

private ThreadPoolTaskScheduler threadPoolTaskScheduler;

/**

*

* ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。

* ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,

* 在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)

* @return

*/

@Bean

public ThreadPoolTaskScheduler threadPoolTaskScheduler() {

ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();

return new ThreadPoolTaskScheduler();

}

/**

* 在ScheduledFuture中有一个cancel可以停止定时任务。

*/

private ScheduledFuture> future;

/**

* 启动任务

**/

@RequestMapping("/startTask")

public String startCron() {

future = threadPoolTaskScheduler.schedule(new SchedulingRunnable(), new CronTrigger("0/5 * * * * *"));

System.out.println("DynamicTaskController.startCron()");

try{

//get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

//future的get()设定超时时间

Object o = future.get(3900, TimeUnit.MILLISECONDS);

System.out.println("===>>> "+o);

Object o1 = future.get();

System.out.println("===>>> "+o1);

}

catch ( Exception e){

System.out.println(e);

}

return "startTask";

}

/**

* 启此任务

**/

@RequestMapping("/stopTask")

public String stopCron() {

if (future != null) {

future.cancel(true);

}

System.out.println("DynamicTaskController.stopCron()");

return "stopTask";

}

/**

* 变更任务间隔,再次启动

**/

@RequestMapping("/changeCron")

public String changeCron() {

stopCron();// 先停止,在开启.

future = threadPoolTaskScheduler.schedule(new SchedulingRunnable(), new CronTrigger("*/10 * * * * *"));

System.out.println("DynamicTaskController.changeCron()");

return "changeCron";

}

}

4.2 编写一个简单的线程:

package com.example.power_spider.utils;

import java.text.SimpleDateFormat;

import java.util.Date;

import cn.hutool.core.date.DateUtil;

/**

* @author Mr.Hao

* @date 2020-03-27

*/

public class SchedulingRunnable implements Runnable {

@Override

public void run() {

Date date = DateUtil.date();

System.out.println("现在执行函数的时间为:"+date);

}

}

4.3 注:上面类中有几个点需要了解:

一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。

ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)

在ScheduledFuture中有一个cancel可以停止定时任务。

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值