在Camel中,如果文件已经存在,有没有办法在一段时间后使用Timer组件和Spring配置重命名文件?
只有通过调用将重命名文件的Java方法的Timer路由才能实现吗?
所以,我有一个我想从中提取数据的套接字。数据每天都在流动。因此,我不仅希望将数据保存到一个特定文件中。
所以我的思考过程让我只是在X段时间后重命名现有文件,让Netty路由创建一个新文件,因为它在重命名后不再存在。
我的路线类似于:
<route customId="true" id="socketToFileRoute">
<from uri="netty4:tcp://localhost:9999?clientMode=true&textline=true" />
<transform>
<simple>${in.body}\n</simple>
</transform>
<to uri="file://data?fileName=socketData.txt&charset=utf-8&fileExist=Append"/>
</route>
有没有办法按以下方式设置定时器路由?:
<route customId="true" id="dataFileRenamer">
<from uri="timer://renameFile?fixedRate=true&period=50"/>
<to uri="file://data/socketData.txt?rename the file created in the previous route" />
</route>
答案 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&textline=true" />
<transform>
<simple>${in.body}\n</simple>
</transform>
<toD uri="file://data?fileName=socketData-${date:now:yyyyMMddHHmmss}.txt&charset=utf-8&fileExist=Append"/>
</route>
这将为每条消息动态解析端点,从而导致每秒生成一个新文件,或者您想要使用的任何时间段。