2017-01-14 7 views
0

camel-csvを使用して大きなCSVをダウンロードして解析したいと思っています。満足している解決策を見つけられません。 camel-csvは、ディスクに置かれたファイルを読み込んで処理するように設計されているようです。Apache 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); 
     }  
    } 
} 

をしかし、それのCSVアンマーシャルにファイルやパイプをダウンロードするcamel-ahcのようなものを使用することは可能でしょうか?次のようなもの:

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

答えて

0

Camel-csvはcsvをマーシャリングしてアンマーシャリングするためのものです。いくつかのURLからファイルをダウンロードするには、camel-netty4-httpのような別のコンポーネントが必要です。

簡単な例:あなたが整列化する前に文字列に変換する必要があるかもしれません

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

EDIT:あなたのルートをトリガーするためにいくつかの方法が必要に複数のファイルをダウンロードすることが

[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}"); 

注意あなたがあなたのリクエストを送信するためにそれを使用する予定がある場合、あなたはまだラクダhttp4コンポーネントを必要としています。 http://camel.apache.org/splitter.html dynamicをご覧ください: http://camel.apache.org/message-endpoint.html

+0

はい、これはクールです。 1つのURLのために。私の場合、私はURLの全リストを処理したいです。あなたのソリューションを使ってどうすればいいですか? – Martinffx

関連する問題