Spring 与 TaskExecutor 集成优雅关闭

问题描述 投票:0回答:1

我有一个 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 graceful-shutdown
1个回答
0
投票

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。它对应用程序中的其他异步进程一无所知。

© www.soinside.com 2019 - 2024. All rights reserved.