[英]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.