actor - 从 ActorSystem 或 Context (Akka.NET) 按名称获取演员
问题描述
是否可以检查 ActorSystem 中是否存在演员?
我只是不想将 IActorRef 引用传递给每个演员的构造函数,并希望有类似 GetOrCreate 方法来实例化所需的演员。所以它可能就像我会在整个演员系统中使用的单例演员。
解决方案
您可以使用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需要一个父级——一个actor系统或者另一个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插件提供。
推荐阅读
- java - 创建 CSV 文件 Android
- java - 如何使用 Android 从 Cloud Firestore 中的地图中检索特定字段?
- python-3.x - 使用客户端凭据时,authlib 是否支持刷新我的访问令牌?
- docker - 为什么 IIS 上的 docker 在源代码更改后会出现 http 403 错误?
- python - 使用 Flask、SQLAlchemy 和 WTForms 在多对多关系中获取用户选择数据
- node.js - 当 index.d.ts 存在时,TypeScript 不会导入 index.js
- vba - 使用输入框 VBA 更改 PowerPoint 中的字体
- java - 如何将 ArrayList 放入 AbstractTableModel?
- python - 1 个变量中的多个条件
- html - 在移动设备/平板电脑/较小的屏幕尺寸上查看时让 div 元素向下移动的最简单方法(这也是最佳实践)