Camel Bindy流有效负载和写入文件

xkrw2x1b  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(138)

我有一个路径,假设读取一个巨大的XML文件,然后写一个带有头的CSV文件。XML记录需要首先转换,所以我将其Map到java POJO,然后再次封送它以写入CSV文件。
我无法加载内存中的所有记录,因为该文件包含200k以上的记录。
问题:我只看到最后一条记录被添加到CSV文件中。不确定为什么它没有将数据附加到现有文件中。
如何让它工作的任何想法。标头是CSV中必需的。我没有看到任何其他选项直接转换流并将标头写入CSV,而不首先将其解组到Pojo。我也尝试使用BeanIO,这需要我添加一个标头记录,但不确定如何将其注入流中。

from("{{xml.files.route}}")

            .split(body().tokenizeXML("EMPLOYEE", null))
            .streaming()
            .unmarshal().jacksonXml(Employee.class)

            .marshal(bindyDataFormat)

            .to("file://C:/Files/Test/emp/csv/?fileName=test.csv")

            .end();

如果我尝试附加到现有文件,那么CSV文件会将标题附加到记录的每个迭代。

.to("file://C:/Files/Test/emp/csv/?fileName=test.csv&fileExist=append")
ovfsdjhp

ovfsdjhp1#

这里的问题与camel-bindy有关,而不是file-component。它希望你封送集合对象而不是单个对象,因此如果你单独封送每个对象,并且在Employee类上有@CsvRecord(generateHeaderColumns = true ),那么每次封送单个Employee对象时,你都会得到头。
您可以将generateHeaderColumns设置为false并手动启动带有头字符串的文件。获取Bindy注解类的头的一种方法是使用apache-commons中的org.apache.commons.lang3.reflect.FieldUtils获取带有DataField注解的字段,并基于position、columnName和fieldName构造头字符串。
当我需要将一些内容流到文件时,我通常更喜欢camel-stream而不是file-component,但是使用带有append的file-component可能也同样有效。

范例:

第一个

相关问题