开始/停止支持?

有没有办法启动或停止使用使用上下文文件或@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?

下一篇: How to Pickle a python dictionary into MySQL?