Camel中有一个while循环吗?

时间:2013-11-27 11:11:13

标签: while-loop apache-camel esb do-while

是否有关于Camel的while循环的想法? 我们使用Camel进行批处理(实际上并不是我所知道的ESB的职权范围)。我想在ESB中处理消息时继续检查其他内容的状态。我只能找到一个循环定义次数的循环,即用于测试或每隔x秒检查一次的石英定时器。这些都不合适。

有任何建议,还是我只是在ESB的职权范围之外提出要求?

3 个答案:

答案 0 :(得分:2)

做这样的事情怎么样:

<camelContext id="myContext">
    <route id ="initializer">
        <!--This will be created only once -->
        <from uri="timer://foo?repeatCount=1"/>
        <to uri="seda:mySedaQueue"/>
    </route>

    <route id ="myRoute">
        <from uri="seda:mySedaQueue"/>
        <choice>
            <when>
                <simple>{your condition if you want to continue}</simple>
                ...
                <to uri="seda:mySedaQueue" />
            </when>
            <otherwise>
                ...
            </otherwise>
        </choice>
    </route>
</camelContext>

答案 1 :(得分:1)

骆驼timer:怎么样?

E.g。

from("timer://foo?fixedRate=true&period=1000")
.to("bean:myBean?method=someMethodName");

参考:Camel Timer Component

答案 2 :(得分:1)

尝试使用DynamicRouter。

它使用Expression类来确定分派交换的下一个路由。如果表达式返回null,则表示它将停止路由。

通过这种方式,您可以评估交换内容并继续路由到同一路由,直到您决定停止为止,然后返回null。

from("direct:start")
.dynamicRouter(new Expression() {
    @Override
    public <T> T evaluate(Exchange exchange, Class<T> type) {
        if (<your condition>) return (T) "direct:whileRoute";
        return null;
    }
})
.to("mock:finish");

from("direct:whileRoute")
    .process(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            // Do whatever you want
        }
    });