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实例中


谢谢。

两种可能的解决方案是:

  • 将webservice ref定义为消息类的属性(
    Level1Message
    Level2Message
    ,等等),并通过消息传递将其沿链传播
  • 将需要Web服务的参与者定义为具有接受Web服务作为参数的构造函数。然后,在创建这些参与者时,使用接受构造函数参数的
    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();