使用apache camel压缩文件

时间:2016-12-29 06:11:53

标签: zip apache-camel

我正在保存路径C:\Cdr\core\year\month\date\fileName上的文件 并且我想压缩前一天和之前创建的所有文件。我无法找到一种方法来提供动态文件路径和文件名来消费者压缩文件。即使使用filename=${beans:utility.generateFileName},我也只能提供文件名而不是文件路径。有没有办法使用apache Zip文件数据格式。

2 个答案:

答案 0 :(得分:0)

使用 GenericFileFilter 根据创建的日期过滤文件。在运行时使用此选项,您可以跳过与所需条件不匹配的文件。

  

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

动态路径:我不确定您期望的动态程度。文件使用者是一种轮询消费者,在想要接收消息时明确地进行呼叫。因此,您可以硬编码文件路径或在运行时设置从属性文件(Ref:Proertyplaceholder)解析的动态路径,如下所示,

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

要压缩文件:您必须使用以下聚合模式,

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

希望它有所帮助!!

答案 1 :(得分: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");
  }
}