Java ApacheCamel文件拆分器示例

Java ApacheCamel文件拆分器示例,java,integration,apache-camel,splitter,Java,Integration,Apache Camel,Splitter,我收到一个包含由换行符分隔的数字ID的文件\n: 等等。我想使用Camel将文件转换为以下POJO的实例: public class IDFile { private String fileName; // The name of the file private List<Long> ids; // All the IDs in the file (123948, 939904, etc.) // Constructor, getters/s

我收到一个包含由换行符分隔的数字ID的文件\n:

等等。我想使用Camel将文件转换为以下POJO的实例:

public class IDFile {
    private String fileName;    // The name of the file
    private List<Long> ids;     // All the IDs in the file (123948, 939904, etc.)

    // Constructor, getters/setters, etc.
}
我试着看看是否可以使用Camel的组件从我身上完成这项工作,但感觉好像我在试图将一个圆钉子塞进一个方孔中:

<route>
    <from uri="file://input/idfile"/>
    <split streaming="true">
        <tokenize token="\n" />
        <to uri="bean://idfileProcessor?method=process"/>
    </split>
</route>

上面的内容看起来像是将我的文件分割成一个列表,但我还需要与列表关联的文件名。有什么想法吗?

在exchange上有一个头文件名。您的处理器/bean被传递一个对交换的引用,您可以从那里获取头并将其与您被调用的令牌相关联

您的路线可能如下所示:

<camel:route id="splitter_test">
    <camel:from uri="file:///home/steppra1/camel_test?delete=true&amp;idempotent=true" />
    <camel:to uri="bean:splitBean?method=init" />
    <camel:split streaming="true">
        <camel:tokenize token="\n" />
        <camel:to uri="bean:splitBean?method=addToken" />
    </camel:split>
    <camel:to uri="bean:splitBean?method=done" />
    <camel:log message="${in.body}" loggingLevel="INFO" logName="split_test" />
</camel:route>
输入到名为splitter.text和splitter_2.txt的路由会产生以下日志输出:

2013-12-18 18:20:02,081 INFO  split_test - Tuple [first=splitter.txt, second=[1, 2, 3, 5]]
2013-12-18 18:20:46,610 INFO  split_test - Tuple [first=splitter_2.txt, second=[1, 2, 3, 5]]

HTH

exchange上有一个头文件名。您的处理器/bean被传递一个对交换的引用,您可以从那里获取头并将其与您被调用的令牌相关联

您的路线可能如下所示:

<camel:route id="splitter_test">
    <camel:from uri="file:///home/steppra1/camel_test?delete=true&amp;idempotent=true" />
    <camel:to uri="bean:splitBean?method=init" />
    <camel:split streaming="true">
        <camel:tokenize token="\n" />
        <camel:to uri="bean:splitBean?method=addToken" />
    </camel:split>
    <camel:to uri="bean:splitBean?method=done" />
    <camel:log message="${in.body}" loggingLevel="INFO" logName="split_test" />
</camel:route>
输入到名为splitter.text和splitter_2.txt的路由会产生以下日志输出:

2013-12-18 18:20:02,081 INFO  split_test - Tuple [first=splitter.txt, second=[1, 2, 3, 5]]
2013-12-18 18:20:46,610 INFO  split_test - Tuple [first=splitter_2.txt, second=[1, 2, 3, 5]]

HTH

idfileProcessor是否映射到某个地方的IDFile。因为它看起来像一个处理器。如果是,您能告诉我们您是如何处理交换的吗?谢谢@Ashish+1-我想我的想法是让服务器为我执行转换,这样当消息到达idfileProcessor(是的,骆驼处理器)时,我就可以从交换中提取IDFilePOJO,如下所示:IDFile IDFile=IDFileexchange.getIn.getBody;。然后,idfileProcessor可以处理IDFile实例。抱歉搞混了!idfileProcessor是否映射到某个地方的IDFile。因为它看起来像一个处理器。如果是,您能告诉我们您是如何处理交换的吗?谢谢@Ashish+1-我想我的想法是让服务器为我执行转换,这样当消息到达idfileProcessor(是的,骆驼处理器)时,我就可以从交换中提取IDFilePOJO,如下所示:IDFile IDFile=IDFileexchange.getIn.getBody;。然后,idfileProcessor可以处理IDFile实例。抱歉搞混了!感谢@Ralf+1-在我的idfileProcessor中,它只是一个实现Camel处理器的Java类,因此包含一个公共的void processExchange方法,您能否提供一个代码示例,说明我如何获得我的IDFile实例,这意味着我需要从您提到的CamelFileName头中获得的字符串文件名字段以及列表ID?再次感谢!我用一个使用bean而不是处理器的例子更新了答案。对不起,我没有仔细阅读你的评论。在您的处理器中,您可以像我在doneExchange方法中那样访问文件名。我还觉得这不需要JavaBean,您可以使用SpringDSL中支持的脚本语言之一来实现。也许其他人可以提供一个例子?谢谢@Ralf+1-在我的idfileProcessor中,它只是一个实现Camel处理器的Java类,因此包含一个公共的void processExchange方法,你能提供一个代码示例,说明我如何获得我的IDFile实例吗,这意味着我需要从您提到的CamelFileName头中获得的字符串文件名字段以及列表ID?再次感谢!我用一个使用bean而不是处理器的例子更新了答案。对不起,我没有仔细阅读你的评论。在您的处理器中,您可以像我在doneExchange方法中那样访问文件名。我还觉得这不需要JavaBean,您可以使用SpringDSL中支持的脚本语言之一来实现。也许其他人可以提供一个例子?
2013-12-18 18:20:02,081 INFO  split_test - Tuple [first=splitter.txt, second=[1, 2, 3, 5]]
2013-12-18 18:20:46,610 INFO  split_test - Tuple [first=splitter_2.txt, second=[1, 2, 3, 5]]