我有2个POJO:
public class Witch {
private Broom broom;
private List<Spell> spells;
// constructors, getters/setters, etc.
}
public class ValidatedWitches {
private List<Witch> goodWitches
private List<Witch> badWitches;
// constructors, getters/setters, etc.
}
我有一个我写的Camel处理器会产生一个ValidatedWitches
实例(同样由2 List<Witch>
组成):
public class WitchValidator implements Processor {
@Override
public void process(Exchange exchange) {
List<Witch> witchesToValidate = (List<Witch>)exchange.getIn().getBody();
ValidatedWitches validated = validate(witchesToValidate);
exchange.getOut().setBody(validated);
}
private ValidatedWitches validate(List<Witch> toValidate) {
// For each witch, determines if it is a good witch, or a bad witch,
// and places it on an appropriate list.
List<Witch> good = new ArrayList<Witch>();
List<Witch> bad = new ArrayList<Witch>();
// etc...
return new ValidatedWitches(good, bad);
}
}
我现在想以一种方式路线我的好女巫名单,以及另一种方式我的坏女巫名单:
<route id="witch-route">
<!-- Everything before my WitchValidator component... -->
<to uri="bean:witchValidator?method=process" />
<choice>
<when>
<simple>???</simple>
<to uri="direct:goodWitches" />
</when>
<when>
<simple>???</simple>
<to uri="direct:badWitches" />
</when>
</choice>
</route>
我可以在<choice>
内放置ValidatedWitches.getGoodWitches()
并将它们发送到direct:goodWitches
,然后将ValidatedWitches.getBadWitches()
路由到direct:badWitches
?
答案 0 :(得分:6)
<choice
&gt;是一个或另一个,所以在您的示例中,您只能到达一个目标URI。因此,您可能需要在<split>
之前添加<choice>
,以便评估两条单独的邮件。
请参阅splitter了解您的选项,例如,您可能希望使用返回两个ValidatedWitches对象列表的方法创建自己的POJO - 一个只填充“goodWitches”集合,另一个填充“ badWitches“仅填充集合。
有许多predicate选项可供使用,但很容易检查每个数组是否为空。
然后你的路线看起来像这样:
<to uri="bean:witchValidator?method=process" />
<split>
<method beanType="SPLITTER_CLASS_NAME" method="SPLITTER_METHOD" />
<choice>
<when>
<simple>${body.goodWitches.size} > 0</simple>
<to uri="direct:goodWitches" />
</when>
<when>
<simple>${body.badWitches.size} > 0</simple>
<to uri="direct:badWitches" />
</when>
</choice>
</split>
关键点: