在我的Spring Boot应用程序中,基于Cron作业(每5分钟运行一次),我需要在我的数据库中处理2000个产品。
现在这些2000产品的处理时间超过5分钟。当第一个Cron作业尚未完成时,我遇到了第二个Cron作业运行的问题。
是否有Spring / Cron开箱即用的功能,可以在开始下一个作业之前同步这些作业并等待上一个作业完成?
请告知如何正确实施此类系统。无论如何,以下技术也可用Neo4j,MongoDB,Kafka。请告知如何使用Spring / Cron单独或甚至与上述技术一起正确设计/实现此功能。
1)您可以尝试使用@Scheduled(fixedDelay = 5*60*1000)
。它将保证下一次调用将在前一次调用完成后的5分钟内严格执行。但这可能会破坏您的日程安排要求
2)您可以将底层ThreadExecutor的池大小限制为1个线程,因此下一个调用必须等到上一个完成,但这又会破坏逻辑,因为它会影响@Scheduled
调用的所有周期性任务
3)您可以使用Quartz而不是spring的原生@Scheduled
。配置起来比较复杂,但允许通过@DisallowConcurrentExecution
注释或通过在工作细节中设置JobDetail::isConcurrentExectionDisallowed
来实现所需的行为