【问题标题】:Spring Integration aggregate doesn`t workSpring Integration 聚合不起作用
【发布时间】:2020-11-25 20:03:29
【问题描述】:

有我的代码: 当我进行聚合时,我的程序没有给出结果并且没有完成。我需要制作自定义聚合逻辑吗?(如果是,我该如何制作)

            public boolean accept(Order order){
                log.info("Filter for order: "+order);
                if(order.getOrderState()==(OrderState.CANCELED)){
                    log.info("order " + order + " doesn`t pass filter");
                    return false;
                }
                log.info("order " + order + " pass filter");
                return true;
            }
        
            @Bean
            public IntegrationFlow get() {
                return IntegrationFlows.from("input")
                        .<File, List<String>>transform(this::readFile).<List<String>,List<Order>>transform(this::getOrder)
                        .split().filter(this::accept).aggregate()
                        .get();
            }
        

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

    由于您在标准 split()aggregate() 之间有一个 filter(),因此这是预期的行为。拆分器生成具有相关详细信息标头的消息:keysequencesize。默认聚合器依赖这些标头来确保该组得到满足,但由于过滤器中的false 可能会丢失一些拆分项,因此默认聚合器无法将整个组构建到预期的size .

    这确实可以通过groupTimeout() 之类的东西来解决。只是因为我们无法预测有多少消息会通过过滤器,所以我们只能让它在超时后部分释放。

    在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/message-routing.html#agg-and-group-to

    另一方面,您似乎在处理文件内容。 FileSplitter 可能会满足您的要求。它有一个markers 选项可以发出,所以当FileMarker.END 到达聚合器时,你可以确保释放组。在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/file.html#file-splitter

    【讨论】: