如何在spring集成中推迟消费消息

时间:2018-02-22 15:16:51

标签: java spring spring-boot spring-integration

我正在使用Spring Integration 5.0.1和Spring Boot 2.0.0.RC1

开发应用程序

目前,应用程序响应ApplicationReadyEvent并运行一些可能需要一段时间才能完成的初始化代码。这不使用任何弹簧集成组件。

我还有一些非常基本的集成流程,使用java dsl编写并在配置中声明为bean。

当流程开始消费消息时,有没有办法推迟?我希望能够在初始化完成后手动启动它们。

似乎配置ControlBus将是解决方案,但我不知道如何将这样的东西与其他流程连接起来。

以下是流消费消息的示例:

IntegrationFlows.from(sourceGateway)
                .transform(Transformers.fromJson(IncomingTask.class, jsonObjectMapper))

                .handle(IncomingTask.class, (incomingTask, headers) -> {

                //stuff with the task here.

                })

                .get();

1 个答案:

答案 0 :(得分:1)

是的,你肯定可以在这件事上使用ControlBus。使用Java DSL,它看起来像:

@Bean
public IntegrationFlow controlBus() {
    return IntegrationFlowDefinition::controlBus;
}

要使用它,您需要:

@Autowired
@Qualifier("controlBus.input")
private MessageChannel controlBusChannel;

现在我们需要了解您的目标IntegraionFlow是如何开始的。什么消息消息。例如,我有这个:

@Bean
public IntegrationFlow fileFlow1() {
    return IntegrationFlows.from("fileFlow1Input")
            .handle(Files.outboundAdapter(tmpDir.getRoot()),
                        c -> c.id("fileWriting").autoStartup(false))
                .get();
    }

注意c.id("fileWriting").autoStartup(false)id用于端点bean,可以通过发送到控制总线的命令访问端点bean。 autoStartup(false)表示它不会立即使用消息,但仅在我们调用start()时才会消费。我这样做:

this.controlBusChannel.send(new GenericMessage<>("@fileWriting.start()"));

您应该在配置中确保将消息消费推迟到您需要的时间。