Spring 集成 DSL 关闭策略

Spring Integration DSL Shutdown Strategy

目前我有这个流程

package com.example.demo.flow;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.dsl.*;
import org.springframework.integration.dsl.channel.MessageChannels;
import org.springframework.integration.file.dsl.Files;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.concurrent.Executors;

/**
 * Created by on 03/01/2020.
 */
@Component
@Slf4j
public class TestFlow {

    @Bean
    public StandardIntegrationFlow errorChannelHandler() {

        return IntegrationFlows.from("testChannel")
                .handle(o -> {

                    log.info("Handling error....{}", o);
                }).get();
    }

    @Bean
    public IntegrationFlow testFile() {


        IntegrationFlowBuilder testChannel = IntegrationFlows.from(Files.inboundAdapter(new File("d:/input-files/")),
                e -> e.poller(Pollers.fixedDelay(5000L).maxMessagesPerPoll(5)
                        .errorChannel("testChannel")))
                .channel(MessageChannels.executor(Executors.newFixedThreadPool(5)))
                .transform(o -> {

                    throw new RuntimeException("Failing on purpose");

                }).handle(o -> {
                });

        return testChannel.get();


    }


}

我计划因关闭而停止此流程,但流程中可能包含一些文件。 如果我关闭集成流程,当前正在处理的文件是否仍会完成,或者它们可能会停止并杀死它们的线程?

如果停止而不是销毁,过程中的一切都会得到妥善处理。只有新数据将从源或消息通道发出。当您关闭它时,这也是 ApplicationContext 的自然优雅关闭行为:它首先停止 beans 让它们完成正在进行的任何事情,然后才销毁它们。

因此,到目前为止,您的意图应该没问题。请与我们分享您的经验(如果有的话)- 如果需要,我们将尽快进行适当的修复。关键是停止阶段的目标确实是不发出新数据,但让现有处理正常完成。在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/system-management.html#jmx-shutdown