[英]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中。 有关示例,请参阅此项目 。
两种可能的解决方案是
Level1Message
, Level2Message
等)的Level2Message
,并通过消息传递将其传播到链中。 将需要webservice的actor定义为具有接受webservice作为arg的构造函数。 然后,在创建这些actor时,使用接受构造函数args的Props.create
,如下所示:
getContext().actorOf(Props.create(Level2Actor.class, client))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.