2016-03-31 12 views
0
public class MySpout implements IRichSpout{ 
    private List fileName; //enter code here 

    public void nextTuple(){  
     File file = new File("D:/small progs/tika_document_type_detection.pdf"); 
     fileName.add(file); 
     this.collector.emit(new Values(fileName)); 
    } 

} 

In Bolt 
public class MyBolt implements IRichBolt{ 
    public void execute(Tuple tuple){ 
     FileInputStream stream = new FileInputStream(tuple.getValues(0)); 
     //can i use this stream obj to parse this file(using Apache tika) 
    } 
} 

ここではSpoutからBoltにファイルオブジェクトを渡すことができません。私はこれに何かを見逃していますか?まず最初に私の質問は、SpoutからBoltにオブジェクトを渡すことができます:Apache StormのSpoutからBoltにファイルを渡すことはできますか?

SpoutOutCollector collecot.emit(fileName) 

ここで、fileNameはファイルオブジェクトを含むオブジェクトのリストです。

答えて

0

SpoutがListFileというオブジェクトを生成して、シリアル化されてボルトに送信されるため、コードが機能しません。私はの内容を送っするためにあなたがしたいと思います...それはあなたが望むものではない、

public void execute(Tuple tuple){ 
    List<File> files = (List<File>)tuple.getValue(0); 
} 

しかし、私は推測する:このように、ボルトはこのようFileオブジェクトのリストを受け取ることができますSpoutからBoltまでバイト単位でファイルを作成します。

public void execute(Tuple tuple){ 
    Byte b = tuple.getByte(0); 
} 

FileInputStream stream = null; 
public void nextTuple() { 
    if(stream == null) { 
     stream = new FileInputStream(new File("...")); 
    } 
    this.collector.emit(new Values(new Byte(stream.read())); 
} 

はもちろん、ボルトは今組につき1バイトを受信します。このためには、Spout.nextTuple()でファイルを開いて、バイトによってそのバイトを読み、EMITを経由して、単一のバイトを放出する必要があります

+0

解決してくれてありがとうございますが、私がここでやろうとしていることはスパウトから複数のファイルを送信する必要があり、各ボルトはそのファイルを受け取り内容を抽出する必要があります。 –

+0

それでは、私のバイト・バイ・アドバイスによる問題は何ですか?ファイルごとに1つのタプルを使用したいですか?はいの場合、完全な内容を保持するには小さすぎる場合は、バイト配列またはバイト配列のリストを使用してください。または、「複数のファイルを送信する」ということをより詳細に指定できますか? –

+0

私はあなたの提案に何の問題もありませんが、いくつかの疑問を持っています。私の要件はスパウトがデータベースから複数のファイル(1000個のファイル)をフェッチし、スパウトがボルトとボルトでファイルを収集し、 Apache Tikaを使用してファイルの内容とメタデータを抽出しています)。今、私の質問は、私がバイト単位でバイトを送信すれば解析できますか? –

関連する問題