在 Apache Camel 中使用 header 附加到 CSV 文件

Append to CSV file with header in Apache Camel

我需要根据收到的消息构建一个 csv 文件。我通过附加到文件来做到这一点:

.toD("file://" + OUTPUT_PATH + "?FileName=${exchangeProperty.OUTPUT_FILENAME}" + "&FileExist=Append")

虽然这很好用,但我 运行 遇到了一个问题。我还需要在 CSV 文件中包含一个 header 行。现在我正在用 .mashall().csv() 编组成 CSV 格式,但是省略了 header.

虽然我可以使用 header 创建 CSV 格式,但:

CsvDataFormat csvFormatWithHeader = new CsvDataFormat();
csvFormatWithHeader.setHeader(Arrays.asList(new String[] { "A", "B", "C", "D" }.clone()));

.marshall(csvFormatWithHeader)

这将为我添加的每一行添加 header 行。 所以我想要实现的是仅在创建新文件时添加 header。

我一直在尝试两种方法,但都没有奏效:

  1. 检查路径中是否存在文件并相应地应用csv格式
  2. 使用 bean 或方法设置 marshall 数据格式

作为最后一个选项,我可以在文件关闭时添加 header,但感觉效率很低,因为我不知道该文件可能会变成多大。

如何使用 Apache Camel 2.23.2 实现这些方法中的任何一种。

好的,最终使用 header 我能够使选项 1 起作用。这是我现在的路线:

.setProperty("OUTPUT_FILENAME",method(this, "determineOutputFilename()"))
.setHeader("fileExists", method(this, "outputFileExists"))
.choice()
  .when(header("fileExists"))
    .marshal().csv()
  .endChoice()
  .otherwise()
    .marshal(csvFormatWithHeader)
  .endChoice()
.end()

文件检查逻辑为(在路由class内实现):

public boolean outputFileExists(@ExchangeProperty("OUTPUT_FILENAME") String fileName){
    boolean fileExists = new File(PROCESSING_PATH + "/" + fileName).exists();
    return fileExists;
}