2016-05-16 71 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

嗯..感谢您的帮助。我现在将它标记为答案。 –