如何保证多个集成流程的有序 start/stop

how to guaranty orderly start/stop of multiple integration-flows

假设我的应用程序有以下 2 个流程:

    @Bean
    IntegrationFlow flow1() {
        return IntegrationFlows.from(() -> LocalDateTime.now(), c -> c.poller(Pollers.fixedDelay(Duration.ofSeconds(10))))
                .channel("DIRECT_CHANNEL")
                .get();
    }

    @Bean
    IntegrationFlow flow2() {
        return IntegrationFlows.from("DIRECT_CHANNEL")
                .handle(lateToStartOutboundAdapter)
                .get();
    }

如何保证 flow1 不会在 flow2 中的所有组件都准备好之前开始发送消息?
更一般地说,我怎样才能有序地开始我的集成流程?

我目前的做法如下:
1) 我定义了一个 controlBus Integration-flow:

@Bean
public IntegrationFlow controlBusFlow() {
    return IntegrationFlows.from("CONTROL_CHANNEL").controlBus().get();
}

2) 我将所有其他集成流程中的第一个端点组件设置为 autoStart=false:

    @Bean
    IntegrationFlow flow1() {
        return IntegrationFlows.from(() -> LocalDateTime.now(),
                    c -> c.poller(Pollers.fixedDelay(Duration.ofSeconds(10)))
                            .autoStartup(false)
                            .id("flow1Component"))
                .transform(p -> p)
                .channel("DIRECT_CHANNEL")
                .get();
    }

    @Bean
    IntegrationFlow flow2() {
        return IntegrationFlows.from("DIRECT_CHANNEL")
                .transform(p -> p,
                        c -> c.autoStartup(false)
                              .id("flow2Component"))
                .log(LoggingHandler.Level.INFO, m -> m.toString())
                .get();
    }

3) 最后我定义了一个服务器组件,我在其中通过控制总线启动所有流程:

@Component
public class Server implements SmartLifecycle {

    private boolean running;
    List<String> flowComponents = ImmutableList.of("flow2Component","flow1Component")

    @Autowired
    @Qualifier("CONTROL_CHANNEL")
    private MessageChannel controlChannel;

    public void start() {
        flowComponents.forEach(s -> 
            controlChannel.send(MessageBuilder.withPayload("@" + s + ".start()").build());
        running = true;
    }

    public void stop() {
        flowComponents.reverse().forEach(s -> 
            controlChannel.send(MessageBuilder.withPayload("@" + s + ".stop()").build());
        running = false;
    }

    public boolean isRunning() {
        return running;
    }

以上是有序 start/stop 我的集成流程的有效方法吗?
非常感谢您的专业知识。 最好的问候

DirectChannel 的消费者无需将 autoStartup 设置为 false;这样的组件不是"active"。 start() 所做的就是让消费者订阅该频道。

你只需要在轮询器上设置它,当你准备好时启动那个。