2016-05-16 10 views
0

Der folgende Code erstellt eine Topologie, die mit einer Tülle beginnt. In diesem ist TenderEventSpout2 ein Akka Actor.Storm Topology Builder mit Akka Actors

TopologyBuilder builder = new TopologyBuilder(); 
builder.setSpout("EventSpout", new TenderEventSpout2(), 1); 

TenderEventSpout2 sieht wie folgt aus:

public class TenderEventSpout2 extends UntypedActor implements IRichSpout{ 

    @Override 
    public void onReceive(Object message){// throws IOException {} 

    @Override 
    public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {} 

    @Override 
    public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {} 

    @Override 
    public void nextTuple() {} 


    //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; 
    } 

} 

Dies kompiliert erfolgreich, aber ich habe diesen Fehler:

You cannot create an instance of [org.quadrisk.toplogy.TenderEventSpout2] explicitly using the constructor (new). You have to use one of the 'actorOf' factory methods to create a new actor. See the documentation.

Aber ein Schauspieler zu schaffen actorOf mit wie mir vorgeschlagen zurückkehren würde ein Objekt ActorRef-Typ. Wie gehe ich hier vor? Danke im Voraus.

+1

Ich bin mir nicht sicher .. Haben Sie eine einfache Besetzung versucht? Wenn eine Umwandlung nicht funktioniert, können Sie anstelle einer Klasse zwei Klassen verwenden und eine "ActorRef" -Mitgliedsvariable in Ihre Auslaufklasse aufnehmen. –

+0

@ MatthiasJ.Sax Einfache Besetzung hat nicht funktioniert. Also folgte dein zweiter Vorschlag. Es klappt ! –

Antwort

0

Sie müssen verwenden zwei Klassen verwenden, anstatt ein:

  1. die ersten Geräte Actor
  2. die zweiten Geräte IRichSpout

In Ihrem Ausguss, fügen Sie ein ActorRef Membervariable, dass Halten Sie eine Instanz Ihrer ersten Klasse, die Sie über ActorSystem#actorOf(...) erhalten.

+0

Ihre Antwort ist ziemlich verwirrend. Das Erstellen von zwei Klassen ist die korrekte Vorgehensweise, aber eine davon ist für den Auslauf und die andere ist ein 'Akteur'. Der Actor-Proxy "ActorRef" sollte innerhalb der Spout-Klasse erstellt werden, die als Handle für ActorWorld fungiert. Auf diese Weise würde es kein Problem geben, 'Akka Actor' in oder mit der Tülle einzubeziehen. –

+0

Danke für Ihren Hinweis. Mein schlechtes - ich habe diese Antwort schnell gemacht, ohne es zu überdenken. Aktualisieren Sie es jetzt. (Ich muss gestehen, dass ich kein Akka Experte bin) –

+0

Hmm .. danke für deine Hilfe. Ich markiere es als die Antwort jetzt. –