我有一个 Spring Boot Web 应用程序,它会在 120 秒超时后正常关闭。
最近,我们向同一应用程序添加了 Spring 集成流程,以便能够处理目录中的某些文件。
轮询器使用 TaskExecutor 在多个线程(目前为 5 个)中处理文件。
public TaskExecutor chunkExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
taskExecutor.setAwaitTerminationSeconds(120);
return taskExecutor;
}
PollerSpec 看起来像:
public void accept(SourcePollingChannelAdapterSpec sourcePollingChannelAdapterSpec) {
sourcePollingChannelAdapterSpec.poller(Pollers.fixedDelay(fixedDelay)
.taskExecutor(chunkExecutor)
.maxMessagesPerPoll(maxMessagesPerPoll)
.transactionSynchronizationFactory(transactionSyncFactory)
.transactional(new PseudoTransactionManager()));
}
我们注意到 Spring Integration 流程并不遵循主应用程序的正常关闭。 在某些情况下,轮询器甚至会在 Tomcat 关闭后拾取文件。
如果我们不使用taskExecutor,流程看起来不错
在使用 taskExecutor 时,我还需要做些什么才能使 Spring Integration 流程像主 Spring Boot 应用程序一样优雅地关闭吗?
Spring Integration 中的入站通道适配器的轮询逻辑基于
TaskScheduler
。因此,您可以像对执行程序那样查看其各自的自定义:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling
请参阅
spring.task.scheduling.shutdown
属性。
您提到的 Spring Boot 中的“优雅关闭”实际上仅适用于 Tomcat。它对应用程序中的其他异步进程一无所知。