2016-05-16 101 views
0

以下代碼構建一個以噴口開始的拓撲。在此,TenderEventSpout2是一個Akka演員。帶Akka Actors的Storm拓撲生成器

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

TenderEventSpout2看起來是這樣的:

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

} 

這編譯成功,但我得到這個錯誤:

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.

但是創建使用actorOf一個演員的建議將返回我的目標ActorRef類型。我該如何解決這個問題。提前致謝。

+1

我不確定..你試過簡單的演員嗎?如果演員不工作,您可以使用兩個類而不是一個,並向您的噴口類中添加一個「ActorRef」成員變量。 –

+0

@ MatthiasJ.Sax簡單的投射不起作用。所以遵循你的第二個建議。有用 ! –

回答

0

您需要使用使用兩個類,而不是一個:

  1. 第一工具Actor
  2. 第二器具IRichSpout

在你的嘴,你添加一個ActorRef成員變量,即持有您通過ActorSystem#actorOf(...)獲得的第一堂課的實例。

+0

你的回答很混亂。創建兩個類是正確的方法,但其中一個是噴口,另一個是「Actor」。應該在噴口類中創建Actor Actor'ActorRef',它將作爲ActorWorld的句柄。通過這種方式,在涉及噴嘴內或噴嘴內的「Akka Actor」時不存在任何問題。 –

+0

感謝您的提示。我的壞 - 我迅速回答這個問題,而沒有重新考慮它。現在更新它。 (必須承認,我不是阿卡專家) –

+0

嗯..感謝您的幫助。我現在將它標記爲答案。 –