我们应该在 Spring Boot 中将@Scheduled 与控制器方法(如@PostMaping)一起使用吗?
Should we use @Scheduled together with controller method (like @PostMaping) in SpringBoot?
我正在使用 SpringBatch
但我找不到任何关于 Spring 的 @Scheduled
的文档或教程,显示它与某些控制器方法一起使用(用 [ 注释=13=], @PostMapping
).
比如我有这个控制器方法
@Scheduled(cron = "0 */5 * ? * *")
@PostMapping("/create-progress-data")
public ResponseEntity<?> createSomething(@Request Something request) { }
我可以很容易地创建另一个方法来做与 createSomething
主体相同的事情,然后将它放在 @Component
或 Service
中,但在这样做和只是在控制器方法之上应用@Scheduled
,我不知道哪个更好。
我可以看到:
使用 @Scheduled
:代码最少,只需找到即可。但是我们有点以错误的方式使用控制器方法。但是我不认为它违反了设计模式中的单一责任点。
创建另一个方法并将其放入其他@Component
或@Service
:分离控制器方法和cron作业的职责但重复代码。
Ps:我需要这样实现,因为我们需要支持两种方式来触发作业。通过 api 调用(控制器方法),或定期(使用 @Scheduled
)。
请注意,在这种情况下,控制器方法的代码和预期的 cron 作业是相同的。
我认为最好将这两种启动工作的方式分开。您可以将控制器用于基于 API 的按需作业启动,并使用 @Scheduled
方式用于按定义的计划启动作业的后台进程。
也就是说,您应该考虑作业定义的并发策略。例如,如果作业启动请求来自 API 并尝试启动已按计划启动的相同作业(当时可能是 运行),您的系统应该怎么做?还有其他用例,但这取决于您的要求。
我正在使用 SpringBatch
但我找不到任何关于 Spring 的 @Scheduled
的文档或教程,显示它与某些控制器方法一起使用(用 [ 注释=13=], @PostMapping
).
比如我有这个控制器方法
@Scheduled(cron = "0 */5 * ? * *")
@PostMapping("/create-progress-data")
public ResponseEntity<?> createSomething(@Request Something request) { }
我可以很容易地创建另一个方法来做与 createSomething
主体相同的事情,然后将它放在 @Component
或 Service
中,但在这样做和只是在控制器方法之上应用@Scheduled
,我不知道哪个更好。
我可以看到:
使用
@Scheduled
:代码最少,只需找到即可。但是我们有点以错误的方式使用控制器方法。但是我不认为它违反了设计模式中的单一责任点。创建另一个方法并将其放入其他
@Component
或@Service
:分离控制器方法和cron作业的职责但重复代码。
Ps:我需要这样实现,因为我们需要支持两种方式来触发作业。通过 api 调用(控制器方法),或定期(使用 @Scheduled
)。
请注意,在这种情况下,控制器方法的代码和预期的 cron 作业是相同的。
我认为最好将这两种启动工作的方式分开。您可以将控制器用于基于 API 的按需作业启动,并使用 @Scheduled
方式用于按定义的计划启动作业的后台进程。
也就是说,您应该考虑作业定义的并发策略。例如,如果作业启动请求来自 API 并尝试启动已按计划启动的相同作业(当时可能是 运行),您的系统应该怎么做?还有其他用例,但这取决于您的要求。