1

下面是我的代码:

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");

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

移动文件的代码:

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

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

4

1 回答 1

1

这里发生了什么?

第二条路线正在表演

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

移动和删除操作

默认情况下,Camel 会将使用的文件移动到相对于使用文件的目录的 .camel 子文件夹中。

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

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

有一个警告(避免读取当前由另一个应用程序写入的文件)和一涵盖了这一点。列出一些可能的方法供您参考。

  1. 使用doneFileName(检查USING DONE FILESWRITING DONE FILES
  2. 设置足够大的值delay
  3. 采用readLock
  4. move通过(设置名称和大小)停止noop并控制idempotent行为idempotentKey
于 2021-04-14T13:35:11.130 回答