从ActorSystem或上下文(Akka.NET)中按名称获取演员

时间:2019-08-30 06:59:58

标签: actor akka.net

是否可以检查ActorSystem中是否存在actor?
我只是不想将IActorRef引用传递给每个actor构造函数,并且希望有类似GetOrCreate方法的实例化所需的actor。因此,它就像一个单例演员,我将在整个演员系统中使用。

2 个答案:

答案 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));