繁体   English   中英

Akka - 演员如何获得对Web服务的引用

[英]Akka - How can an actor get a reference to a web service

我有以下基本设置:

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()中我想使用我在main方法中创建的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深?

在我的main方法中有一种方法可以注册一个在创建actor时调用的工厂吗? 喜欢:

system.register(Level3Actor.class, myFactoryWithReferenceToWebService);

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

谢谢。

使用扩展名 它们是向演员提供“全局”内容的好方法:

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将您的依赖项放入您的actor中。 有关示例,请参阅此项目

两种可能的解决方案是

  1. 将webservice ref定义为消息类( Level1MessageLevel2Message等)的Level2Message ,并通过消息传递将其传播到链中。
  2. 将需要webservice的actor定义为具有接受webservice作为arg的构造函数。 然后,在创建这些actor时,使用接受构造函数args的Props.create ,如下所示:

     getContext().actorOf(Props.create(Level2Actor.class, client)) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM