2016-12-29 19 views
1

私はパス上にファイルを保存していますC:\Cdr\core\year\month\date\fileName 前日に作成されたすべてのファイルを圧縮したいと思います。動的ファイルパスとファイル名をファイルConsumerに提供する方法が見つかりませんファイルを圧縮します。 filename=${beans:utility.generateFileName}を使用している場合でも、ファイルパスではなくファイル名のみを提供できます。これはApacheのZipファイルデータフォーマットを使用する方法です。apache camelでファイルをジッピングする

+0

を、あなたは昨日から作成されたすべてのファイルを圧縮したいですファイル名を持つ特定のパス(ftpまたはローカルドライブですか)が正しいですか?サンプルコードを共有できますか? –

答えて

0

私は

<routeContext id="zipFileRoute" xmlns="http://camel.apache.org/schema/spring"> 
    <route id="zipFile"> 
    <from uri="file://C:/CdrJson?recursive=true&amp;delete=true&amp;filter=#myFilter/> 
    <log message="reading from ${in.header.CamelFileName} and file path is ${file:path}"/> 
    <setHeader headerName="CamelFileName"> 
     <simple>${bean:utility?method=processFileName}</simple> 
    </setHeader> 
    <marshal> 
     <zipFile/> 
    </marshal> 
    <to uri="file://C:/CdrJson"/> 
    <log message="This route finished zipping files"/> 
    </route> 
</routeContext> 

にmyFilterをのためのコードのフィルタを使用して同じ道を見つけ:私が正しくあなたの質問を理解していれば

public class MyFileFilter<T> implements GenericFileFilter<T> { 
    public boolean accept(GenericFile<T> file) { 
    // we want all directories 
    if (file.isDirectory()) { 
     return true; 
    } 
    Calendar date = new GregorianCalendar(); 
    String fileName = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); 
    if(file.getFileNameOnly().startsWith(fileName)){ 
     return false; 
    } 
    return !file.getFileName().endsWith(".zip"); 
    } 
} 
0

GenericFileFilterを使用して、作成日に基づいてファイルをフィルタリングします。これを実行時に使用すると、目的の基準に合致しないファイルをスキップすることができます。

参考:http://camel.apache.org/file2

ダイナミックパス:私はあなたが期待しているダイナミズムのどのレベルについて確認していません。ファイルコンシューマはポーリングコンシューマであり、メッセージを受信するときに明示的に呼び出しを行います。どちらかのハードコードは、ファイルパスまたはプロパティファイルから実行時に解決し、動的パスだから、あなたがすることができます:以下のように(参考文献Proertyplaceholder)、

<from uri="file:{{consumer.file.path}}"/> 

は、Zipファイルには:あなたは以下のように集約パターンを使用する必要があります、

from("file:{{consumer.file.path}}") 
    .aggregate(new ZipAggregationStrategy()) 
    .constant(true) 
    .completionFromBatchConsumer() 
    .eagerCheckCompletion() 
    .setHeader(Exchange.FILE_NAME, constant("<DesiredFileName>.zip")) 
.to("file:output/directory"); 

希望します。

+0

問題は、日付、月、年が含まれているので、プロパティファイルにファイルパスまたはファイル名を静的に与えることができないということです。また、上記のコードをSpring DSLで記述する方法については、参考にしてください。 –

+0

ファイルのコンシューマディレクトリパスは、動的な単純な「式」、つまり$ {}をサポートしていません。したがって、現在の日付タイムスタンプをパスで使用することはできません。しかし、別の回避策は、実行時にURL全体を計算できるコンシューマテンプレートを使用できることです。注:ConsumerTemplateは少しコストがかかるので、Springのライフサイクルを処理させます。 java dslをspring dslに変換するのは簡単です。 Pl try –

+0

あなたが現在の交換に基づいて実行時に計算された動的URIを受け入れるpollenrichを使うことができるのは、単一のファイルだけを取得する場合です。 –