2016-04-04 3 views
0

Ich bin neu bei Apache Storm 0.9.5. Ich benutze Eclipse mit Maven. Java-Version 1.7.Verwirrung mit @Override Annotation

Versuch 1: Ich versuche, einen Beispielcode zu tun und folgte den Anweisungen im page

import java.util.*; 
//import storm tuple packages 
import backtype.storm.tuple.Fields; 
import backtype.storm.tuple.Values; 

//import Spout interface packages 
import backtype.storm.topology.IRichSpout; 
import backtype.storm.topology.OutputFieldsDeclarer; 
import backtype.storm.spout.SpoutOutputCollector; 
import backtype.storm.task.TopologyContext; 

//Create a class FakeLogReaderSpout which implement IRichSpout interface 
    to access functionalities 

public class FakeCallLogReaderSpout implements IRichSpout { 
    //Create instance for SpoutOutputCollector which passes tuples to bolt. 
    private SpoutOutputCollector collector; 
    private boolean completed = false; 

    //Create instance for TopologyContext which contains topology data. 
    private TopologyContext context; 

    //Create instance for Random class. 
    private Random randomGenerator = new Random(); 
    private Integer idx = 0; 

    @Override 
    public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { 
     this.context = context; 
     this.collector = collector; 
    } 

    @Override 
    public void nextTuple() { 
     if(this.idx <= 1000) { 
     List<String> mobileNumbers = new ArrayList<String>(); 
     mobileNumbers.add("1234123401"); 
     mobileNumbers.add("1234123402"); 
     mobileNumbers.add("1234123403"); 
     mobileNumbers.add("1234123404"); 

     Integer localIdx = 0; 
     while(localIdx++ < 100 && this.idx++ < 1000) { 
      String fromMobileNumber = mobileNumbers.get(randomGenerator.nextInt(4)); 
      String toMobileNumber = mobileNumbers.get(randomGenerator.nextInt(4)); 

      while(fromMobileNumber == toMobileNumber) { 
       toMobileNumber = mobileNumbers.get(randomGenerator.nextInt(4)); 
      } 

      Integer duration = randomGenerator.nextInt(60); 
      this.collector.emit(new Values(fromMobileNumber, toMobileNumber, duration)); 
     } 
     } 
    } 

    @Override 
    public void declareOutputFields(OutputFieldsDeclarer declarer) { 
     declarer.declare(new Fields("from", "to", "duration")); 
    } 

    //Override all the interface methods 
    @Override 
    public void close() {} 

    public boolean isDistributed() { 
     return false; 
    } 

    @Override 
    public void activate() {} 

    @Override 
    public void deactivate() {} 

    @Override 
    public void ack(Object msgId) {} 

    @Override 
    public void fail(Object msgId) {} 

    @Override 
    public Map<String, Object> getComponentConfiguration() { 
     return null; 
    } 
} 

Die Fehlermeldung erhalte ich als

folgt

der Bereinigungsverfahren() vom Typ CallLogCreatorBolt muss eine Superklassenmethode

überschreiben

Und die schnelle Lösung zu

@Override Anmerkung entfernen

Wenn ich die Anmerkung entfernt Ich habe keine Fehler sehen. Wie wir wissen, hat IRichBolt API eine Methode mit dem Namen cleanup() mit den gleichen Parametern. Die Idee meiner Klasse CallLogCreatorBolt ist, cleanup() in IRichBolt Klasse überschreiben.

1. Meine Frage ist, was ist das Problem in meiner Verwendung @Override?

Versuch 2: ich alle Methoden innerhalb der Klasse gelöscht CallLogCreatorBolt. Dann klickte ich auf Add unimplemented methods Option, die Eclipse bietet.

public class CallLogCreatorBolt implements IRichBolt { 

    public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { 
     // TODO Auto-generated method stub 
    } 

    public void execute(Tuple input) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void cleanup() { 
     // TODO Auto-generated method stub 
    } 

    public void declareOutputFields(OutputFieldsDeclarer declarer) { 
     // TODO Auto-generated method stub 
    } 

    public Map<String, Object> getComponentConfiguration() { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

Wenn Sie bemerken, habe ich @Override für cleanup() Methode allein hinzugefügt. Ich erhalte den gleichen Fehler wie bei meinem ersten Versuch. Aber andere Methoden sind in Ordnung.

Bitte vergib mir, wenn ich etwas sehr Grundlegendes verpasse! Danke im Voraus.

+1

Scheint, wie ur Problem gelöst [hier] (http://stackoverflow.com/questions/1678122/must-override-a-superclass-method-errors-after-importing-a -project-in-eclips). – f1sherox

+0

@ f1sherox: Vielen Dank. hat für mich gearbeitet! – Andy

Antwort

1

Dank @ f1sherox

Das Problem mit JRE-Version war. Das Projekt wurde in JRE1.5 ausgeführt. Aber idealerweise sollte es mindestens 1,6 sein.

Das Update ist wie folgt:

Rechtsklick auf Ihr Projekt innerhalb des Explorer-Projekt gesehen/Navigator-Panel -> wählen Sie Eigenschaften -> Java Build Path -> Wählen Sie auf JRE Systembibliothek [JavaSE -1.5] -> Klicken Sie auf die Schaltfläche "Bearbeiten" -> Wählen Sie die gewünschte JRE-Version aus [Ich wählte Version 1.7] -> Fertig stellen -> Anwenden und Ok.

Wir sind fertig :)