定时器后Camel重命名文件

时间:2016-11-29 17:09:06

标签: apache-camel

在Camel中,如果文件已经存在,有没有办法在一段时间后使用Timer组件和Spring配置重命名文件?

只有通过调用将重命名文件的Java方法的Timer路由才能实现吗?

所以,我有一个我想从中提取数据的套接字。数据每天都在流动。因此,我不仅希望将数据保存到一个特定文件中。

所以我的思考过程让我只是在X段时间后重命名现有文件,让Netty路由创建一个新文件,因为它在重命名后不再存在。

我的路线类似于:

<route customId="true" id="socketToFileRoute">
    <from uri="netty4:tcp://localhost:9999?clientMode=true&amp;textline=true"  />
    <transform>
        <simple>${in.body}\n</simple>
    </transform>
    <to uri="file://data?fileName=socketData.txt&amp;charset=utf-8&amp;fileExist=Append"/>
</route>

有没有办法按以下方式设置定时器路由?:

<route customId="true" id="dataFileRenamer">
    <from uri="timer://renameFile?fixedRate=true&amp;period=50"/>
    <to uri="file://data/socketData.txt?rename the file created in the previous route" />
</route>

2 个答案:

答案 0 :(得分:1)

您无法重命名该文件,至少不是我所知道的。您可以通过计时器节点使用.enrich()语法读取现有文件的内容来丰富您的路径,然后使用新的时间戳创建一个新文件。一个粗略的例子:

.from("timer://renameFile?fixedRate=true&period=50")
.enrich("file://pathtofile?fileName=<filename>")
.to("file://pathtofile?fileName=${file:name.noext}-${date:now:yyyyMMdd-HHmmss}.${file:ext}");

这些方面的东西。当然,这意味着您为每个时段生成一个新文件。如果你真的想重命名,那么我想你必须创建一个处理器类并使用标准的java API来查看你是否可以使用它并重命名它。

答案 1 :(得分:1)

你不需要计时器或任何复杂的东西,你应该只使用toD (Dynamic To endpoint)

<route customId="true" id="socketToFileRoute">
    <from uri="netty4:tcp://localhost:9999?clientMode=true&amp;textline=true"  />
    <transform>
        <simple>${in.body}\n</simple>
    </transform>
    <toD uri="file://data?fileName=socketData-${date:now:yyyyMMddHHmmss}.txt&amp;charset=utf-8&amp;fileExist=Append"/>
</route>

这将为每条消息动态解析端点,从而导致每秒生成一个新文件,或者您想要使用的任何时间段。