骆驼选择示例

时间:2013-12-18 21:44:34

标签: java apache-camel routes choice

我有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

1 个答案:

答案 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>

关键点:

  • Splitter应返回两个或更多对象的集合
  • 选择需要能够区分拆分对象