[英]Get existing or create new akka actor
我正在嘗試使用ActorFor獲取現有的ActorRef,或者如果不存在則創建一個新的。 我有以下代碼,但它似乎沒有按預期工作。 .isTerminated()始終為true。
ActorSystem system = ActorSystem.create("System");
ActorRef subscriberCandidate = system.actorFor("akka://System/user/"+name);
if (subscriberCandidate.isTerminated())
{
ActorRef subscriber = system.actorOf(new Props(new UntypedActorFactory() {
public UntypedActor create() {
return new Sub(name,link);
}
}), name);
System.out.println(subscriber.path().toString() + " created");
}
else
System.out.println("already exists");
我在這里想念什么? 提前致謝。
“獲取或創建”只能由指定角色的父級執行,因為只有那個父級(如果不存在)可以創建角色,並且只有父級可以一致地創建(即沒有競爭條件)。 在演員中,您可以做
// assuming a String name like "fred" or "barney", i.e. without "/"
final Option<ActorRef> child = child(name);
if (child.isDefined())
return child.get();
else
return getContext().actorOf(..., name);
不要在頂層執行此操作(即使用system.actorOf
),因為那樣一來您就不能確定誰在請求創建時“勝出”,並且依賴用戶的監護人也不是一個好的監管策略。
將您的查找更改為:
system.actorFor("/user/" + name)
如果您正在查找的是本地參與者,則不需要“ akka:// System”部分。 假設該參與者已經在代碼中的其他地方啟動了。 如果沒有,那是行不通的。
根據給定的代碼,您正在調用actorFor
來查找不存在的actor。 在調用actorOf
之前,actor並不存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.