Apache camel 在计时器之后重命名文件

Apache camel 在计时器之后重命名文件,apache-camel,Apache Camel,在Camel中,如果文件已经存在,是否有任何方法可以使用组件和Spring配置在设置的时间段后重命名文件 是否只有通过使用一个调用Java方法的计时器路由来重命名文件才能实现 所以,我有一个套接字,我想从中提取数据。数据每天都在流动。因此,我不想一直将数据路由到一个特定的文件中 因此,我的思考过程让我在X段时间后重命名现有文件,并让Netty路由创建一个新文件,因为重命名后该文件将不再存在 我的路线类似于: <route customId="true" id="socketToFileRo

在Camel中,如果文件已经存在,是否有任何方法可以使用组件和Spring配置在设置的时间段后重命名文件

是否只有通过使用一个调用Java方法的计时器路由来重命名文件才能实现

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

因此,我的思考过程让我在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>

${in.body}\n
有没有一种方法可以沿着以下线路设置计时器路线

<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>

您不能重命名该文件,至少我不知道。您可以通过计时器节点,通过使用
.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}");
.from(“timer://renameFile?fixedRate=true&period=50")
.充实file://pathtofile?fileName=")
.至(”file://pathtofile?fileName=${file:name.noext}-${date:now:yyyyMMdd HHmmss}.${file:ext}”);

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

您不需要计时器或任何复杂的东西,只需使用:


${in.body}\n

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

我不确定是否理解。你是说以那种方式使用
enrich
将旧文件的正文(
socketData.txt
)写入一个新文件(
fileName=newFile.txt
这样做正确吗?),然后我可以重命名那个新文件?但是原始文件(
socketData.txt
)将继续写入?也许我在Spring的语法有误,但我似乎无法做到这一点。是的,您将在丰富内容的同时基于内容创建一个新文件。旧文件仍将被写入。如果你真的想重命名旧的,你需要创建一个bean或一个处理器类,并使用普通的JavaAPI来进行重命名。我仍然没有这个功能,但我相信这不是我想要的,我必须使用java选项。我的问题是,我需要原始文件中的最新条目进行处理,所以我不会反复处理旧数据。所以我不能只是重复使用原始文件的主体!啊哈,在这种情况下,你最好使用处理器类,使用java api来获取最新的数据,并对文件执行你想要的操作。。便宜的方式。。我只有名为
socketData-${date:now:yyyyMMddHHmmss}.txt的文件
。这意味着每一秒它都会派生出一个新文件,并为这一秒收集数据这正是我最终得到的解决方案。也许我应该把答案贴出来,而不是仅仅写在评论里,哈哈。另外,我没有得到一个
toD
端点,一个简单的
to
对我来说很好。是的,如果你自己找到了一个可以接受的答案,你应该一直这样做;你现在也可以这样做,你只需要等48小时就可以接受了。
<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>