为什么骆驼只移动部分数据的文件?

Why does camel move file with only partial data?

下面是我的代码:

from("quartz2:report?cron=" + cronExpression)
.routeId("jms:queue:test")
.setHeader("CURRENT_TIME", simple("${date:now:MM-dd-yyyy HH:mm:ss.S}"))     
        //Writing column names for report to the file
        .setBody()
        .simple(summaryHeaders)
        .transform(body().append("\n"))
        .to("file:" + filePath + "?fileName="+scheduledFileName+"${date:now:MM-dd-YYYY}.csv&fileExist=append")
.to("sql:" + dataSummaryQuery + "?dataSource=#dataSource")
        .log(LoggingLevel.INFO, "Summary query executed")
        .marshal(csvFormat)
        .to("file:" + filePath + "?fileName="+scheduledFileName+"${date:now:MM-dd-YYYY}.csv&fileExist=append")
        .log(LoggingLevel.INFO, "Report written to file")
.setBody()
        .simple(fileHeaders)
        .transform(body().append("\n"))
        .to("file:" + filePath + "?fileName="+scheduledFileName+"${date:now:MM-dd-YYYY}.csv&fileExist=append")

        .to("sql:" + dataExtractionQuery + "?dataSource=#dataSource")
        .log(LoggingLevel.INFO, "data query executed")
        .marshal(csvFormat)

        .to("file:" + filePath + "?fileName="+scheduledFileName+"${date:now:MM-dd-YYYY}.csv&fileExist=append");

直到上面的代码,一切正常,所有需要的数据都在文件中。当我尝试将文件移动到其他位置时,移动的文件只有来自上面的 dataextractionquery 的数据。以前的数据不在文件中。这里发生了什么?如何移动添加了所有数据的文件?

移动文件的代码:

from("file:" + filePath + "?fileName="+scheduledFileName+"${date:now:MM-dd-YYYY}.csv&fileExist=append")
        .to("file:" + filePath + "?fileName=temp/");

如果我不移动文件,文件中的所有数据我都有

这里发生了什么?

第二条路线正在表演

  1. 文件消费者每 500 毫秒扫描一次源文件(默认 delay 值为 500
  2. 文件制作者覆盖目标文件(默认fileExist值为Override
  3. [异步到上述步骤] 文件使用者将文件移动到相对于源目录的 .camel 子文件夹(默认 move 设置)

MOVE AND DELETE OPERATIONS

By default, Camel will move consumed files to the .camel sub-folder relative to the directory where the file was consumed.

每当数据的一部分流向源时,路由会消耗它,覆盖目标文件(源中的数据),然后将其丢弃。最后,路由得到最后一部分数据并将其写入目标位置。

如何移动添加了所有数据的文件?

有一个警告(Avoid reading files currently being written by another application) and a section覆盖这个。列出一些可能的方法供您参考。

  1. 使用doneFileName(选中USING DONE FILES and WRITING DONE FILES
  2. delay
  3. 设置足够大的值
  4. 使用readLock
  5. 通过 noop 停止 move 并通过 idempotentKey (set with name and size)
  6. 控制 idempotent 行为