我们遇到的问题是,有多个异步线程处理大量数据,需要几分钟甚至几小时才能结束。该 pod 还处理一些其他短期运行的请求。
可能需要移动 pod,并且在此处理过程中会发生关闭。在这种情况下,我们希望线程在短期内完成它们的工作并留下一个状态,我们可以用它来处理剩余的数据。
我们已经使用graceful.shutdown=enable
.
现在的想法是我们@PreDestroy
在 bean 中引入一个方法 with 来创建异步线程。调用此方法时,它将在不同的 bean 中设置“关闭”标志。所有长时间运行的线程在处理过程中都会检查此标志,并在其为真时停止处理并将其处理的干净状态写入数据库。
这或多或少是有效的……但并非一直如此。
正如我在第一次获得关闭触发器后所理解的那样,有一个可配置的时间spring.lifecycle.timeout-per-shutdown-phase
,线程可以在不减少任何所需资源的情况下继续处理它们的工作。时间结束后,所有的shutdownhooks都以未知的顺序处理。@preDestroy
这让我想到,当我使用带有和 标志的方法时,我可能没有所有必要的资源来离开一个干净的状态。
有没有更好的解决方案?
是否需要向线程添加更多配置,例如 setAwaitTerminationSeconds(60);
or setWaitForTasksToCompleteOnShutdown(true);
?