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))))