如何在创建时初始化 Azure Service Fabric Actor?
我试过用初始化方法重载actor构造函数,但没有奏效。
我必须在创建演员后从客户端调用初始化方法,还是有办法让演员在创建过程中自动初始化自己?
如何在创建时初始化 Azure Service Fabric Actor?
我试过用初始化方法重载actor构造函数,但没有奏效。
我必须在创建演员后从客户端调用初始化方法,还是有办法让演员在创建过程中自动初始化自己?
当您在其上调用方法时,首先会创建一个 Actor。因此,如果您需要初始化一个尚不存在的 Actor,您需要确保它首先变得活跃。它自己无法做到这一点。
您可以创建一个方法来初始化 Actor 并使其成为 Actor 接口的一部分。
您还可以使用OnActivateAsync
每次激活都会触发的方法。
在此处阅读有关 Actor 生命周期的更多信息。
Actor 框架在第一次创建 Actor 和激活已停用并处于休眠状态的 Actor 之间没有太大区别。这两个动作都会创建一个新的 Actor 实现实例(调用 .ctor),然后调用OnActivateAsync
. 它在执行分派给 Actor 的任何方法之前执行此操作。如果不调用 Actor 接口上的方法,就无法创建 Actor 的实例,这都是底层ActorBase
和ActorManager
消息处理的一部分。
此外,根据您为 Actor(或)选择的持久性类型,None
托管Actor 的 ActorService 会存储一个与 Actor/ActorService 关联的持久性密钥。这也是 ActorService “知道”它的演员的方式。当您向 ActorService 询问已知 Actor 时,它会查询它的 StateProviderVolatile
Persisted
IActorStateProvider
如果您想第一次运行一些初始化代码,并且仅在第一次激活 Actor 时,您可以为该 Actor 添加一个状态键OnActivateAsync
:
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);
}