【发布时间】:2017-07-19 22:06:25
【问题描述】:
如何在创建时初始化 Azure Service Fabric Actor?
我尝试使用初始化方法重载actor构造函数,但没有成功。
必须在创建actor后从客户端调用初始化方法,还是有办法让actor在创建时自动初始化?
【问题讨论】:
标签: c# .net azure azure-service-fabric service-fabric-actor
如何在创建时初始化 Azure Service Fabric Actor?
我尝试使用初始化方法重载actor构造函数,但没有成功。
必须在创建actor后从客户端调用初始化方法,还是有办法让actor在创建时自动初始化?
【问题讨论】:
标签: c# .net azure azure-service-fabric service-fabric-actor
当您在其上调用方法时,首先会创建一个 Actor。因此,如果您需要初始化一个尚不存在的 Actor,您需要确保它首先处于活动状态。它自己做不到。
您可以创建一个方法来初始化 Actor 并使其成为 Actor 接口的一部分。
您还可以使用OnActivateAsync 方法,该方法将在每次激活时触发。
阅读有关 Actor 生命周期的更多信息here。
【讨论】:
public MyActor(ActorService service, ActorId id) : base(service, id) { InitializeActor(); },但它不起作用。所以在actor创建后调用“Initialize”方法的唯一方法是从actor外部IMyActor myActor = ActorProxy.Create<IMyActor>("myActor"); myActor.InitializeActor();或者使用OnActivateAsync方法,对吧?
Actor 框架在首次创建 Actor 和激活已停用并处于休眠状态的 Actor 之间没有太大区别。这两个动作都会创建一个新的 Actor 实现实例(调用 .ctor),然后调用 OnActivateAsync。它在执行分派给 Actor 的任何方法之前执行此操作。如果不调用 Actor 接口上的方法,就无法创建 Actor 的实例,这都是底层 ActorBase 和 ActorManager 消息处理的一部分。
此外,根据您为 Actor 选择的持久性类型(None、Volatile 或 Persisted),托管 Actor 的 ActorService 存储一个持久性密钥,其中 IActorStateProvider 与 Actor 关联/演员服务。这也是 ActorService 如何“了解”它的演员的方式。当你向 ActorService 询问已知 Actor 时,它会查询它的 StateProvider 以获取
如果您想第一次运行一些初始化代码,并且仅在第一次激活 Actor 时,您可以在 OnActivateAsync 中为该 Actor 添加状态键:
protected override async Task OnActivateAsync()
{
ActorEventSource.Current.ActorMessage(this, "Actor activated.");
var initialized = await this.StateManager.ContainsStateAsync("initalized");
if (!initialized) await Initialize();
}
private async Task Initialize()
{
ActorEventSource.Current.ActorMessage(this, "Actor initialized.");
await this.StateManager.AddStateAsync("initialized", true);
}
【讨论】: