如何中断或取消Spring集成JavaDSL流?

如何中断或取消Spring集成JavaDSL流?,java,spring-integration,dsl,cancellation,Java,Spring Integration,Dsl,Cancellation,考虑实现一种功能,其中JdbcRepositoryHandler(实现MessageHandler)可能侦听外部事件(例如CancelRunEvent) 我想我应该使用Spring'ApplicationEvent支持通过REST控制器端点发布事件。我想我应该让前面提到的处理程序实现ApplicationListener来监听特定事件 问题是:如果处理程序中充满了需要处理的消息,我将如何发出终止所有后续消息的信号,这些消息可能是从上游发出的,例如从filespliter 虽然我可以在调用负责持久

考虑实现一种功能,其中
JdbcRepositoryHandler
(实现
MessageHandler
)可能侦听外部事件(例如
CancelRunEvent

我想我应该使用Spring'
ApplicationEvent
支持通过REST控制器端点发布事件。我想我应该让前面提到的处理程序实现
ApplicationListener
来监听特定事件

问题是:如果处理程序中充满了需要处理的消息,我将如何发出终止所有后续消息的信号,这些消息可能是从上游发出的,例如从
filespliter

虽然我可以在调用负责持久性操作(基于从
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
}

现在还不完全清楚您的意思,也不完全清楚您为什么需要使用
JdbcRepositoryHandler
来管理它,而不是使用其他
ApplicationListener

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


但是,在组超时之前,您可能(可能会)在内存中完成部分聚合。

处理程序本身不需要实现ApplicationListener,这一点您是对的。只是想知道我在哪里可以注册流的侦听器?流的起源是一个HTTP端点。请求参数提供另一个MessageProducingHandler,该处理程序从S3 bucket读取数据并同步到本地文件系统,其输出通道是上述流中的S3通道。不确定“向流注册该侦听器”是什么意思;它实际上不是流程的一部分,而是控制流程的一部分——请参见和。您的侦听器可以直接停止s3消息生成器,也可以向控制总线发送消息来完成此操作。感谢Gary透露这一点和提示。“通知流终止处理”可能是描述我意图的更好方式。在春天,我每天都会发现一些新的东西让我感到高兴。