是否可以检查ActorSystem中是否存在actor?
我只是不想将IActorRef引用传递给每个actor构造函数,并且希望有类似GetOrCreate方法的实例化所需的actor。因此,它就像一个单例演员,我将在整个演员系统中使用。
答案 0 :(得分:1)
您可以使用ActorSelection来检查是否存在任何演员,以要求其标识自己:
var selection = Context.ActorSelection(actorPath);
/// if there's no actor, this operation can timeout
var reply = await selection.Ask<ActorIdentity>(new Identify(null), timeout);
尽管这种方法在任何地方都可以使用,甚至可以跨越网络边界,但是您不能“仅仅”在任何地方创建角色。为了被创建,演员需要父母-一个演员系统或另一个演员。
获取或创建逻辑可以非常简单地从actor内部完成:
IActorRef GetOrCreate(string childName)
{
var child = Context.Child(childName);
if (Equals(child, ActorRefs.Nobody))
child = Context.ActorOf(Props.Create(() => new ChildActor()), childName);
return child;
}
如果需要使其在分布式环境中运行,此功能将由Akka.Cluster.Sharding插件提供。
答案 1 :(得分:0)
ActorSelection具有一个名为“ ResolveOne”的方法,用于检查一个actor是否存在。根据文档:
解析与该选择匹配的IActorRef。返回结果 作为通过IActorRef完成的任务(如果此类参与者) 存在。如果没有ActorNotFoundException,则失败 参与者存在或标识未在提供的内容中完成 超时
这种方法可以像这样使用:
var actorRef = await Context.ActorSelection("Path of Actor !").ResolveOne(TimeSpan.FromSeconds(5));