0

我想使用下载和解析大型 CSV camel-csv,但我无法找到令我满意的解决方案。camel-csv似乎旨在读取和处理放置在磁盘上的文件。

我想通过 HTTP 下载 URL 列表并在下载流时对其进行解析。我可以通过绕过来做到这camel-csv一点:

from("mock:in").process(new TaxiDataProcessor(new DataCSVParserFactory())).to("mock:out");

public class DataProcessor implements Processor {
    private final DataCSVParserFactory csvParserFactory;

    @Inject
    public DataProcessor(DataCSVParserFactory csvParserFactory) {
        this.csvParserFactory = csvParserFactory;
    }

    @Override
    public void process(Exchange exchange) throws Exception {
        String file = (String) exchange.getIn().getBody();
        URL url = new URL(file);
        CSVParser parser = csvParserFactory.build(url);
        for (CSVRecord csvRecord : parser) {
            exchange.getIn().setBody(csvRecord);
        }    
    }
}

但是是否可以使用类似camel-ahc下载文件并将其通过管道传输到 csv 解组的方法?就像是:

from("direct:input").unmarshall().csv().to("direct:out");
template.send("ahc:uri");
4

1 回答 1

0

Camel-csv 用于编组和解组 csv。要从某个 url 下载文件,您需要另一个组件,例如camel-netty4-http.

一个简单的例子:

from("netty4-http:http://localhost:8080/foo")
.marshal().csv()
.log("${body}");

您可能需要在编组之前将其转换为字符串。

编辑:

好的,要下载多个文件,您需要某种方式来触发您的路线。最简单的是计时器,但可以使用你喜欢的任何东西。然后你可以使用 toD() 这是一个动态路由器并在那里注入你的 url。如果要重复此过程,则需要将其拆分然后注入。下面的示例(未经测试)可帮助您入门:

//Create the list of urls any way you like. This is just to show the principle. You can create them in a bean and inject them in a Camel header if you like.
String listOfUrls = "url1, url2, url3";

from("timer:foo?period=5000")
.setHeader("urls", constant(listOfUrls))
.split(header("urls")) //split url is part of body now
.toD("${{body}") //take the url from the body and use that as a uri
.log("${body}");

请注意,如果您打算使用 camel-http4 组件来发送请求,您仍然需要该组件。 http://camel.apache.org/splitter.html在这里查看动态: http ://camel.apache.org/message-endpoint.html

于 2017-01-14T16:01:25.523 回答