Java Akka-参与者如何获得对web服务的引用
我有以下基本设置:Java Akka-参与者如何获得对web服务的引用,java,akka,actor,Java,Akka,Actor,我有以下基本设置: public static void main(...) { final MyWebServiceClient client = new MyWebServiceClient(...,....,....); ... final ActorRef master = system.actorOf(Props.create(Level1Actor.class), "level1"); master.tell(new Level1Message()...); } L
public static void main(...) {
final MyWebServiceClient client = new MyWebServiceClient(...,....,....);
...
final ActorRef master = system.actorOf(Props.create(Level1Actor.class), "level1");
master.tell(new Level1Message()...);
}
Level1Actor.onreceive()
创建几个level2actor:
...
getContext().actorOf(Props.create(Level2Actor.class)).tell(new Level2Message(), getSelf());
...
同样,Level2Actor.onReceive也会创建几个level3actor
我的问题是:在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 deep
在我的main方法中是否有一种方法可以注册某个工厂,在创建actor时调用该工厂?比如:
system.register(Level3Actor.class, myFactoryWithReferenceToWebService);
??或者从Spring的角度来看,我的web服务是一个bean,只是自动连接到Level3Actor实例中
谢谢。两种可能的解决方案是:
Level1Message
,Level2Message
,等等),并通过消息传递将其沿链传播Props.create
,如下所示:
getContext().actorOf(Props.create(Level2Actor.class, client))
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; }
}
}
或者,如果您使用的是Spring,那么您可以使用,并让Spring将您的依赖项DI到您的参与者中。请参见示例。谢谢,这正是我想要的,我将为spring选项提供一个goInner实现类,它非常有用。甚至doc也说使用两个类作为接口和实际实现。但如图所示,使用单个类可以使代码更加干净
import static com.foo.MyWebServiceExtension.MyWebServiceExtProvider;
public class MyUntypedActor extends UntypedActor {
final MyWebServiceClient client =
MyWebServiceExtProvider.get(getContext().system()).getClient();