列出Camel休息服务中文件夹下的文件

时间:2018-01-10 09:41:29

标签: rest apache-camel

我正在使用Camel Rest DSL创建休息服务。在服务中,我需要列出文件夹下的所有文件并对它们进行一些处理。 PFB代码 -

from("direct:postDocument")
    .to("file:/home/s469457/service/content-util/composite?noop=true")
    .setBody(constant(null))
    .log("Scanning file ${file:name.noext}.${file:name.ext}...");

请建议。

~Arunava

2 个答案:

答案 0 :(得分:0)

我建议写一个处理器或bean来列出目录中的文件。我认为这样会更有效,更简单。使用Camel的文件组件,您将不得不处理您可能不期望的复杂性。

不管。您需要进行pollEnrich,然后汇总整个结果。我也认为你会遇到麻烦而且无法多次读取文件,以解决你可能需要创建幂等存储库的问题,但是当读取文件时可能会出现并发/文件锁定问题......

如果你想这样做,这里有一些伪代码可以让你开始:

from("direct:listFiles")    
    .pollEnrich("file:"+getFullPath()+"?noop=true")
    .aggregate(new AggregationStrategy {
       public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
          String filename = newExchange.getIn().getHeader("CamelFileName", String.class)
          if (oldExchange == null) {
              newExchange.getIn().setBody(new ArrayList<String>(Arrays.asList(filename)));
              return newExchange;
          } else {
          ...
       }
    })

答案 1 :(得分:0)

//Camel Rest Api to list files
rest().path("/my-api/")
        .get()
            .produces("text/plain")
            .to("direct:listFiles");

//Camel Route to list files
        List<String> fileList = new ArrayList<String>();
        from("direct:listFiles")
        .loopDoWhile(body().isNotNull())
            .pollEnrich("file:/home/s469457/service/content-util/composite?noop=true&recursive=true&idempotent=false&include=.*.csv")
            .choice()
                .when(body().isNotNull())
                    .process( new Processor(){
                        @Override
                        public void process(Exchange exchange) throws Exception {
                            File file = exchange.getIn().getBody(File.class);
                            fileList.add(file.getName());
                        }
                    })
                .otherwise()
                .process( new Processor(){
                    @Override
                    public void process(Exchange exchange) throws Exception {
                        if (fileList.size() != 0)
                            exchange.getOut().setBody(String.join("\n", fileList));
fileList.clear();
                    }
                })
        .end();