camel split/aggregate 并合并包含 List<B> 的 List<A> 包含 List<C>

camel split/aggregate and merge List<A> that contains List<B> that contains List<C>

给定一个类似于此的结构:

@Data
public class A {
    //..other fields..

    private List<B> bs;
}

@Data
public class B {
    //..other fields..

    private List<C> cs;
}

我必须处理多个 steps/routes 中的 A 类型列表。有些操作在A级,有些在C等其他级别。

我要解决的问题是处理给定 A 的每个 C,然后一些逻辑必须与更新后的 A 模型一起使用。

我可以成功拆分并聚合回 list<C>,但现在我无法在给定 B 和 C 的输出的情况下尝试重建 A。

这是我目前拥有的:

from("direct:my-A-Item")
    .id("direct-a")
    .autoStartup(true)
    .split(ExpressionBuilder.beanExpression(new CSplitter(), "getBs"), new MyAggregationStrategy())
        .streaming()
        .split(ExpressionBuilder.beanExpression(new CSplitter(), "getCs"), new MyAggregationStrategy())
            .streaming()
            .bean(processor, "doStuff")//Working on a since C instance
        .end()
        .bean(processor, "test") //Here I get the worked List<C>
    .end()
    //.bean(processor, "thisProcessorNeedsA").end(); //TODO get the original A and the output List<C> so i can make further work on them

我如何用新的 C 列表更新 B 实例,然后用同样的方法更新 A?

public class CSplitter {

    public List<B> getBs(A a) {
        return a.getBs();
    }

    public List<C> getCs(B b) {
        return b.getCs();
    }
}

public class MyAggregationStrategy implements AggregationStrategy {

    @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        Object newBody = newExchange.getIn().getBody();
        ArrayList<Object> list = null;
        if (oldExchange == null) {
            list = new ArrayList<Object>();
            list.add(newBody);
            newExchange.getIn().setBody(list);
            return newExchange;
        } else {
            list = oldExchange.getIn().getBody(ArrayList.class);
            list.add(newBody);
            return oldExchange;
        }
    }
}

检查文档和在线资源,我找不到任何聚合了上一步正文的示例...欢迎任何提示:)

我会在拆分前将A体夺取作为交换属性,然后就可以了。

from("direct:my-A-Item")
    .id("direct-a")
    .autoStartup(true)
    .setProperty("originalA", body())
    .split
      // etc.
    .end()
    .bean(processor, "myMethod(${property.originalA}, ${body})").end();