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();
给定一个类似于此的结构:
@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();