如何中断或取消Spring Integration Java DSL流程?

时间:2015-10-27 20:58:58

标签: java spring-integration dsl cancellation

考虑其中JdbcRepositoryHandler(实施MessageHandler)可能会侦听外部事件(例如CancelRunEvent)的功能的实现。

我想我会使用Spring' ApplicationEvent支持通过REST控制器端点发布事件。我猜我会有上述处理程序实现ApplicationListener来监听特定事件吗?

问题是:如果处理程序已满足其需要处理的消息,我将如何发信号通知上游可能已发出的所有后续消息,例如来自FileSplitter

虽然我可以在调用负责的方法之前轻松构造要检查的条件,例如,对于持久性操作(基于从CancelRunEvent收到的某个状态),我怎么能完全中断流< /强>

出于说明目的,想象一下如下的流程:

@Bean
protected IntegrationFlow s3ChannelFlow() {
    // @see http://docs.spring.io/spring-integration/reference/html/files.html#file-reading
    // @formatter:off
    return IntegrationFlows
        .from(s3Channel())
        .enrichHeaders(h -> h.headerFunction(RunStats.FILE_TOKEN, f -> UUID.randomUUID().toString()))
        .channel(runStatsChannel())
        .transform(new FileToInputStreamTransformer())
        .split(new FileSplitter())
        .transform(new JsonToObjectViaTypeHeaderTransformer(new Jackson2JsonObjectMapper(objectMapper), typeSupport))
        .publishSubscribeChannel(p -> p.subscribe(persistenceSubFlow()))
        .get();
    // @formatter:on
}

@Bean
protected IntegrationFlow persistenceSubFlow() {
    // @formatter:off
    return f -> f
            // @see http://docs.spring.io/spring-integration/reference/html/messaging-routing-chapter.html#agg-and-group-to
            .aggregate(a -> a
                    .correlationStrategy(new HeaderAttributeCorrelationStrategy(RunStats.FILE_TOKEN))
                    .releaseStrategy(new MessageCountReleaseStrategy(persistenceBatchSize))
                    .sendPartialResultOnExpiry(true)
                    .expireGroupsUponCompletion(true)
                    .groupTimeoutExpression(persistenceBatchReleaseTimeoutMillis)
            )
            .handle(new JdbcRepositoryHandler(typeSupport, metricRegistry, runStatsRepository));
    // @formatter:on
}

1 个答案:

答案 0 :(得分:0)

目前还不完全清楚您的意思或为什么需要JdbcRepositoryHandler来管理此而不是其他ApplicationListener

您的流在s3Channel()上游的某个线程上运行。根据具体情况,您可以stop()消息源,并且在当前消息源之后不会发出新消息(或者如果它是多线程的话)。

但是,您可能(可能会)最终在内存中进行部分聚合,直到该组超时。