Spring integration 如何使用dsl在Spring集成中为聚合器创建定制的发布策略?
我有一个场景,我不想使用聚合器的默认发布策略。我想创建定制的聚合发布策略 更新:更新的集成流程:Spring integration 如何使用dsl在Spring集成中为聚合器创建定制的发布策略?,spring-integration,Spring Integration,我有一个场景,我不想使用聚合器的默认发布策略。我想创建定制的聚合发布策略 更新:更新的集成流程: @Bean public IntegrationFlow fileIntegrationFlow(){ return IntegrationFlows.from(readFilefromDirectory(), fileInboundPollingConsumer()) .split(fileSplitter())
@Bean
public IntegrationFlow fileIntegrationFlow(){
return IntegrationFlows.from(readFilefromDirectory(), fileInboundPollingConsumer())
.split(fileSplitter())
.filter(p -> !(p instanceof FileSplitter.FileMarker),
f -> f.discardChannel("passToAggregate"))
.transform(dataDataTransformer())
.filter(fileFilter())
.wireTap(logChannel())
.channel("passToAggregate")
.aggregate(a->a.releaseStrategy(group ->
group.getMessages()
.stream()
.anyMatch(m ->
FileSplitter.FileMarker.Mark.END.name()
.equals(m.getHeaders().get(FileHeaders.MARKER)))))
.wireTap(logChannel())
.<List<Customer>>handle((p, h) -> new MonitoringData(p))
.transform(Transformers.marshaller(getMarshaller(),resultTransformer(),true))
.handle(fileWriter()).get();
}
现在我将开始使用输出处理器来过滤数据。首先,您应该熟悉所有聚合器选项和策略。为此,您应该查看 之后,您只需在
AggregatorSpec
配置.aggregate()
上执行自动完成即可。自定义的发布策略可以通过以下方法实现:
/**
* Configure the handler with an {@link ExpressionEvaluatingReleaseStrategy} for the
* given expression.
* @param releaseExpression the correlation expression.
* @return the handler spec.
* @see AbstractCorrelatingMessageHandler#setReleaseStrategy(ReleaseStrategy)
*/
public S releaseExpression(String releaseExpression) {
...
/**
* Configure the handler with an
* {@link org.springframework.integration.aggregator.MethodInvokingReleaseStrategy}
* for the target object and method name.
* @param target the target object.
* @param methodName the method name.
* @return the handler spec.
* @see AbstractCorrelatingMessageHandler#setReleaseStrategy(ReleaseStrategy)
*/
public S releaseStrategy(Object target, String methodName) {
...
/**
* @param releaseStrategy the release strategy.
* @return the handler spec.
* @see AbstractCorrelatingMessageHandler#setReleaseStrategy(ReleaseStrategy)
*/
public S releaseStrategy(ReleaseStrategy releaseStrategy) {
...
对于使用filespliter
并在Mark.END
到达时允许释放组的用例,我建议使用以下实现:
.releaseStrategy(group ->
group.getMessages()
.stream()
.anyMatch(m ->
FileSplitter.FileMarker.Mark.END.name()
.equals(m.getHeaders().get(FileHeaders.MARKER))))
当你编辑你的问题时,我没有收到任何通知。请考虑为我的回答添加一些评论,通知我。你还没有完成你的工作。您不能在filespliter
上启用标记。您还必须从.aggregate()
的输出列表中筛选filespliter.FileMarker
。考虑自定义<代码>输出处理器>代码>这是逻辑的。不是吗?现在你有了一个新的有效载荷,但变压器是一样的。我建议您在转换器之前添加.filter()
,以便将标记直接丢弃到聚合器。在我对你的另一个问题的回答中可以看到一种方法。你能解释一下这里为什么需要outputprocessor吗?我的理解是,在聚合器之后,还将添加FileMarker,因此我们需要从聚合器outputCorrect中删除。我为您提供了句柄((p,h)->新的监视数据(p))
,但实际上,这可以在MessageGroupProcessor
中完成,特别是AbstractAggregatingMessageGroupProcessor
,您应该在其中迭代MessageGroup
,删除FileMarker
并将您的MonitoringData
构建为聚合器的输出。现在我已经删除了关联策略,并且在日志中可以在聚合器输出中看到客户对象。
.releaseStrategy(group ->
group.getMessages()
.stream()
.anyMatch(m ->
FileSplitter.FileMarker.Mark.END.name()
.equals(m.getHeaders().get(FileHeaders.MARKER))))