2016-11-29 4 views
1

Camelでは、ファイルがすでに存在する場合、TimerコンポーネントとSpring設定を使用して、一定期間後にファイルの名前を変更する方法はありますか?Camel rename file after timer

ファイルの名前を変更するJavaメソッドを呼び出すTimerルートがあるだけで実現できますか?

したがって、私はデータを取得したいソケットを持っています。データは毎日、毎日流れます。そのため、データを1つの特定のファイルにルーティングし続けるだけではありません。

私の思考プロセスは、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> 

答えて

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> 

これは秒ごとに生成される新しいファイルで、その結果、各メッセージの動的エンドポイントを解決する、または何だろうあなたが使用したい期間。

+1

それは私が終わった正確な解決策です。私はちょうどコメントhahaにそれを書いているのではなく、答えを投稿していたはずです。また、私は 'toD'エンドポイントを得ていませんでした。普通の' to 'は私のためにうまくいきました。 – Jsmith

+0

あなた自身が受け入れられる答えを見つけたら、いつもそうするべきです。あなたはそれを今でもやり遂げることができます。それを受け入れるには、48時間待たなければなりません。 –

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を使用してそれを消費して名前を変更できるかどうかを確認する必要があります。

+0

わかりません。古いファイル( 'socketData.txt')の本体を新しいファイル(' fileName = newFile.txt'はそれを行う正しい方法ですか?)に書き込むことで 'enrich'を使用していると言っていますか?その新しいファイルの名前を変更できますか?しかし元のファイル( 'socketData.txt')は引き続き書き込まれますか?たぶん、私は春に間違って構文を取得しているが、私はその作業を行うように見えることはできません。 – Jsmith

+0

はい、豊かにした瞬間のコンテンツに基づいて新しいファイルを作成します。古いファイルはまだ書き込まれます。古い名前の名前を本当に変更したい場合は、Beanまたはプロセッサクラスを作成し、通常のJava APIを使用して名前を変更する必要があります。 –

+0

私はまだこの機能を持っていませんが、私はこれが私が探しているものではないと信じています。そして、私はJavaのオプションを使う必要があります。私の問題は、処理のために元のファイルに最新のエントリが必要なため、古いデータを何度も何度も処理しないことです。だから私は悲しいことに元のファイルの本体を再利用することはできません! – Jsmith