Spring:启动计划任务的端点

时间:2021-06-10 12:53:34

标签: spring-boot

我有一个完美运行的计划任务,如下所示:

@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
    // something that should execute on weekdays only
}

我想创建一个 REST 端点,以便在正常计划之外启动此任务。

我将如何以编程方式消除此任务?

2 个答案:

答案 0 :(得分:1)

你可以做一些非常简单的事情。

您的日程安排:

@RestController
@RequestMapping(path = "/task")
@RequiredArgsConstructor
public class MyController {

  private final MyClassThatHasTheProcessing process;
  // the executor used to asynchronously execute the task
  private final ExecutorService executor = Executors.newSingleThreadExecutor();

  @PostMapping
  public ResponseEntity<Object> handleRequestOfStartTask() {
    // send the Runnable (implemented using lambda) for the ExecutorService to do the async execution
    executor.execute(() - >{
      process.doHeavyProcessing();
    });

    // the return happens before process.doHeavyProcessing() is completed.
    return ResponseEntity.accepted().build();
  }

}

您的控制器

HTTP 202 Accepted

这将使您的计划任务保持正常运行,并且能够通过点击您的端点来按需触发任务。

ExecutorService 将被返回并释放实际线程,而 process.doHeavyProcessing 会将 ExecutorService 的执行委托给另一个线程,这意味着它将在“火后忘记”中运行' 样式,因为即使在其他任务最终终止之前,为请求提供服务的线程也会返回。

如果您不知道什么是 {{1}},this 可能会有所帮助。

答案 1 :(得分:0)

这可以通过编写如下内容来完成

 @Controller
    MyController {
    
    @Autowired
    MyService myService;
    
     @GetMapping(value = "/fire")
     @ResponseStatus(HttpStatus.OK)
        public String fire() {
            myService.fire();
            return "Done!!";
        }
   }
      
 MyService {
    
@Async
@Scheduled(cron="*/5 * * * * MON-FRI")
public void fire(){
    // your logic here
    
 }
}