开始/停止支持?
有没有办法启动或停止使用使用上下文文件或@Scheduled注释初始化的Spring Scheduled Tasks计划的任务?
我希望在需要时启动任务,并在任务不再需要运行时停止它。
如果这是不可能的,可以选择向线程注入弹簧变量吗?
停止已注册的@Scheduled Bean不是标准功能,因为在org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor
访问它们是私人的。
如果您需要管理它们运行的时间,则需要以编程方式注册它们( TriggerTask
):请参阅org.springframework.scheduling.annotation.SchedulingConfigurer
的文档。 在类型org.springframework.scheduling.config.TriggerTask
有返回org.springframework.scheduling.Trigger
类型的方法。 在那里你可以管理下一个执行时间。
在编程注册的情况下, TriggerTask
可以是beans。
让@Scheduled
方法查找在Application
状态或ServletContext
保存的变量,或者从存储在DB中的值中查找变量。 如果值为TRUE,则继续执行该任务; 如果FALSE,请不要启动。 这个设置将控制预定的运行。
如果你想也可以随意发起任务,请参考Controller的任务方法; 这样你可以随意开火。 此外,如果它的运行时间较长,请创建另一个注释@Async
方法,并从您的Controller调用该方法,以使其在自己的线程中运行。
以下是在Spring Boot中启动/停止预定方法的示例。 您可以使用这些API:
http:localhost:8080 / start - 用于启动固定速率为5000毫秒的预定方法
http:localhost:8080 / stop - 用于停止计划的方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.time.Instant;
import java.util.concurrent.ScheduledFuture;
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class TaskSchedulingApplication {
public static void main(String[] args) {
SpringApplication.run(TaskSchedulingApplication.class, args);
}
@Bean
TaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
}
@Controller
class ScheduleController {
public static final long FIXED_RATE = 5000;
@Autowired
TaskScheduler taskScheduler;
ScheduledFuture<?> scheduledFuture;
@RequestMapping("start")
ResponseEntity<Void> start() {
scheduledFuture = taskScheduler.scheduleAtFixedRate(printHour(), FIXED_RATE);
return new ResponseEntity<Void>(HttpStatus.OK);
}
@RequestMapping("stop")
ResponseEntity<Void> stop() {
scheduledFuture.cancel(false);
return new ResponseEntity<Void>(HttpStatus.OK);
}
private Runnable printHour() {
return () -> System.out.println("Hello " + Instant.now().toEpochMilli());
}
}
链接地址: http://www.djcxy.com/p/9019.html
上一篇: start/stop support?