2016-03-31 3 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) 
    } 
} 

Hier bin ich nicht in der Lage Dateiobjekt von Spout zu Bolt passieren. Fehle ich etwas darin? Zunächst einmal meine Frage ist, können wir ein Objekt aus Spout Pass mit Loch:Ist es möglich, in Apache Storm eine Datei von Spout an Bolt zu übergeben?

SpoutOutCollector collecot.emit(fileName) 

Hier filename die Liste der Objekte, die die Datei-Objekt enthält.

Antwort

0

Sie Code funktioniert nicht, weil Ihr Auslauf eine List von File Objekte emittiert, die serialisiert und an die Schraube gesendet wird. Somit könnte die Schraube wie diese diese Liste der File Objekt erhalten:

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

Aber ich denke, das ist nicht das, was Sie wollen ...

Ich denke, Sie wollen den Inhalt des verschickt an Datei Byte für Byte von Spout to Bolt. Dazu müssen Sie die Datei in Spout.nextTuple() öffnen und ein sie Byte für Byte gelesen und ein einziges Byte über emit emittieren:

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

Natürlich erhalten die Schraube ein einziges Byte pro Tupel jetzt:

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

Danke für die Lösung, aber was ich hier zu tun versuche, ist die Notwendigkeit, mehrere Dateien aus der Tülle zu senden und jede Schraube sollte diese Datei erhalten und den Inhalt extrahieren. –

+0

Also, was ist das Problem mit meinem Vorschlag für Byte für Byte? Möchten Sie ein einzelnes Tupel pro Datei haben? Wenn ja, verwenden Sie einfach ein Byte-Array oder eine Liste von Byte-Arrays, wenn eines zu klein ist, um den vollständigen Inhalt aufzunehmen. Oder können Sie genauer spezifizieren, was Sie unter "Mehrere Dateien senden" verstehen? –

+0

Ich habe kein Problem mit Ihrem Vorschlag, aber habe einige Zweifel, meine Anforderung ist Auswurf wird mehrere Dateien holen (sagen für 1000 Dateien) aus der Datenbank und Ausgießer sollte emittieren, Bolzen und Bolzen wird die Datei sammeln und analysieren die Datei wie (Extrahieren der Inhalte und Metadaten der Datei mit Apache Tika) und jetzt ist meine Frage wird ich in der Lage, es zu analysieren, wenn ich byte by byte senden –

Verwandte Themen