【问题标题】:Camel rename file after Timer定时器后骆驼重命名文件
【发布时间】:2016-12-02 18:07:56
【问题描述】:

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

有没有办法按照以下方式设置 Timer 路由?:

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

【问题讨论】:

    标签: apache-camel


    【解决方案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>
    

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

    【讨论】:

    • 这就是我最终得到的确切解决方案。也许我应该发布答案,而不是仅仅在 cmets 中写出来哈哈。另外,我没有得到toD 端点,一个普通的to 对我来说工作得很好
    • 是的,如果您自己找到了可接受的答案,您应该始终这样做;您现在也可以,您只需等待 48 小时即可接受。
    【解决方案2】:

    您不能重命名文件,至少我不知道。您可以通过计时器节点使用.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 来查看是否可以使用并重命名它。

    【讨论】:

    • 我不确定我是否理解。您是说以这种方式使用enrich 会将旧文件的主体(socketData.txt)写入新文件(fileName=newFile.txt 是正确的做法吗?)然后我可以重命名该新文件?但是原始文件(socketData.txt)会继续写入吗?也许我在 Spring 中弄错了语法,但我似乎无法做到这一点。
    • 是的,您将根据丰富时的内容创建一个新文件。旧文件仍将被写入。如果你真的想重命名旧的,你需要创建一个 bean 或一个处理器类并使用普通的 java api 来进行重命名。
    • 我仍然没有这个功能,但我相信这不是我想要的,我必须使用 Java 选项。我的问题是我需要原始文件中的最新条目进行处理,所以我不会一遍又一遍地处理旧数据。所以我不能只是遗憾地重用原始文件的正文!
    • 啊哈,在这种情况下,您最好使用处理器类并使用 java api 获取最新数据并按照您的意愿处理文件。
    • 我以一种..便宜的方式做到了..我只有名为socketData-${date:now:yyyyMMddHHmmss}.txt的文件。这意味着每一秒它都会产生一个新文件并收集那一秒的数据。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 2023-03-09
    相关资源
    最近更新 更多