Загрузка и анализ CSV с Apache Camel

Я хочу скачать и проанализировать большой CSV с помощьюcamel-csv, и я не могу выяснить решение, которое я доволен. camel-csvпо-видимому, предназначен для чтения и обработки файлов, размещенных на диске.

Я хочу загрузить список URL-адресов через HTTP и проанализировать поток по мере его загрузки. Я могу сделать это, минуя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");

1 ответ

  1. Camel-csv предназначен для маршалинга и распараллеливания csv. Чтобы скачать файл с какого-то url вам нужен другой компонент, как camel-netty4-http.

    Простой пример:

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

    Может потребоваться преобразовать его в String перед маршалингом.

    РЕДАКТИРОВАТЬ:

    Ok чтобы загрузить несколько файлов, необходимо каким-то образом запустить маршрут. Самый простой таймер, но использовать все, что вы предпочитаете. Затем вы можете использовать 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
    Посмотреть dynamicTo здесь:
    http://camel.apache.org/message-endpoint.html