簡體   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