Apache Camel:访问CamelLoopIndex

时间:2013-04-11 12:27:57

标签: apache-camel

我有以下路线DSL:

from("file:" + autoLoadBaseDir + "?move=.classified")
                .loop(fileTypes.length)
                    .choice()
                        .when(header("CamelFileName").contains(fileTypes[Integer.valueOf("${CamelLoopIndex}")]))
                            .to("file:" + classesBaseDir + "/" + fileTypes[Integer.valueOf("${CamelLoopIndex}")]);

如图所示,我希望访问CamelLoopIndex并将其用作数组中的索引。不评估表达式,因此不会创建路径。我究竟做错了什么?提前谢谢。

关于此的文档非常少,而且经过数小时的搜索后,我还没有成功获得解决方案。

更新:我已将相同的问题发布到Camel用户邮件列表。

4 个答案:

答案 0 :(得分:4)

您应该使用$ {property.CamelLoopIndex}

答案 1 :(得分:1)

您可以使用processor或直接访问属性

${exchangeProperty.CamelLoopIndex}

...
    .loop(4)
       .log("${exchangeProperty.CamelLoopIndex}")
       .process(exchange -> {
          Integer index = (Integer) exchange.getProperty(Exchange.LOOP_INDEX);
       })
     .end()
...

enter image description here https://camel.apache.org/components/latest/eips/loop-eip.html https://camel.apache.org/manual/latest/processor.html

希望这会有所帮助

答案 2 :(得分:0)

经过多次选择试验,以下内容适用于我:

from("file:" + autoLoadBaseDir + "?preMove=inprogress&move=.classified")
                .routeId("Test-Route")
                .loop(fileTypes.length)
                .processRef("keFileTypeNameService")
                    .choice()
                        .when(header("CamelFileName").contains(header("MyFileType")))
                            .to("file:" + classesBaseDir + "/?autoCreate=true&fileName=${header[MyFileType]}/${header[CamelFileName]}");

keFileTypeNameService从交换中检索CamelLoopIndex属性。然后使用它来获取该索引处的文件类型。然后只需在标题中设置此文件类型名称即可。 keFileTypeNameService bean如下所示:

@Service( value = "keFileTypeNameService" )
public class FileTypeNameService implements Processor {

    private @Value("${ke.file.types}") String[] fileTypes;

    public void process(Exchange exchange) throws Exception {
        Integer count = exchange.getProperty("CamelLoopIndex", Integer.class);
        String fileType = fileTypes[count];
        exchange.getIn().setHeader("MyFileType", fileType);
    }




}

我希望这可以帮助别人。

答案 3 :(得分:0)

我迟到了,但也许有人会从这个答案中得到帮助。在上面给出的示例中,这适用于我访问Java DSL中的循环索引。

property(Exchange.LOOP_INDEX)

因此,对于上面okello的第一篇文章中的示例,我想这会起作用

Integer.valueOf(property(Exchange.LOOP_INDEX).toString())