2014-01-25 20 views
1

我有以下基本条件:阿卡 - 一个演员怎样才能得到一个Web服务的引用

public static void main(...) { 
    final MyWebServiceClient client = new MyWebServiceClient(...,....,....); 
    ... 
    final ActorRef master = system.actorOf(Props.create(Level1Actor.class), "level1"); 
    master.tell(new Level1Message()...); 
} 

Level1Actor.onRecieve()创建多个Level2Actors:

... 
getContext().actorOf(Props.create(Level2Actor.class)).tell(new Level2Message(), getSelf()); 
... 

,同样Level2Actor.onReceive创建几个Level3Actors

这里是我的问题:在Level3Actor.onRecieve()我想使用我在我的主要方法中创建的Web服务客户端,如:

public void onReceive() { 
... 
EmailSummary summary = client.getEmailSummary(username, password, etc, etc); 
//create and send a response to sender based on 'summary' 
... 
} 

我该如何做到这一点?理想情况下,我想在启动时配置我的web服务(url等),然后访问它深层的几层Actor?

在我的主要方法中是否有一种方法来注册某个在创建actor时被调用的工厂?如:

system.register(Level3Actor.class, myFactoryWithReferenceToWebService); 

?或者从Spring的角度来看,我的Web服务将是一个bean,并且只是自动装入到Level3Actor实例中?

谢谢。

回答

3

使用Extension。他们是一个很好的方式,为客户提供“全球性”的东西演员:

public class MyWebServiceExtension extends 
    AbstractExtensionId<MyWebServiceExtension.MyWebServiceExt> { 

    public static MyWebServiceExtension MyWebServiceExtProvider = 
    new MyWebServiceExtension(); 

    public MyWebServiceExt createExtension(ExtendedActorSystem system) { 
    return new MyWebServiceExt(); 
    } 

    public static class MyWebServiceExt implements Extension { 
    private final MyWebServiceClient client = new MyWebServiceClient(); 

    public MyWebServiceClient getClient() { return client; } 
    } 
} 

然后在您的演员:

import static com.foo.MyWebServiceExtension.MyWebServiceExtProvider; 

public class MyUntypedActor extends UntypedActor { 
    final MyWebServiceClient client = 
    MyWebServiceExtProvider.get(getContext().system()).getClient(); 

或者,如果你正在使用Spring,你可以使用IndirectActorProducer并让Spring DI你的依赖进入你的演员。示例见this project

+0

谢谢你,这正是我之后的事情,我会给弹簧选项一个去 – user1736191

+0

内部实现类是非常有用的。即使文档说接口和实际实现使用两个类。但是正如这里所显示的,只有一个类可以使代码更加干净 – SashikaXP

0

两种可能的解决方案是:

  1. 定义web服务REF作为消息类别的属性(Level1MessageLevel2Message,等等。)与通过消息传递传播下来的链。
  2. 将需要webservice的actor定义为具有接受webservice作为arg的构造函数。然后,在创建这些演员时,使用接受构造ARGS像这样的Props.create

    getContext().actorOf(Props.create(Level2Actor.class, client)) 
    
相关问题