考虑其中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
}
答案 0 :(得分:0)
目前还不完全清楚您的意思或为什么需要JdbcRepositoryHandler
来管理此而不是其他ApplicationListener
。
您的流在s3Channel()
上游的某个线程上运行。根据具体情况,您可以stop()
消息源,并且在当前消息源之后不会发出新消息(或者如果它是多线程的话)。
但是,您可能(可能会)最终在内存中进行部分聚合,直到该组超时。