我有一个完美运行的计划任务,如下所示:
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should execute on weekdays only
}
我想创建一个 REST 端点,以便在正常计划之外启动此任务。
我将如何以编程方式消除此任务?
答案 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
}
}