Azure 服务结构参与者初始化

Azure Service Fabric Actor Initialization

如何在创建时初始化 Azure Service Fabric Actor?

我试过用初始化方法重载 actor 构造函数,但没有成功。

我必须在创建 actor 后从客户端调用初始化方法,还是有办法让 actor 在创建过程中自动初始化自己?

当您在其上调用方法时,首先会创建一个 Actor。因此,如果您需要初始化一个尚不存在的 Actor,则需要先确保它已激活。它不能自己做到这一点。

您可以创建一个方法来初始化 Actor 并使其成为 Actor 接口的一部分。

您还可以使用 OnActivateAsync 方法,该方法会在每次激活时触发。

阅读有关 Actor 生命周期的更多信息here

Actor 框架在第一次创建 Actor 和激活已停用且处于休眠状态的 Actor 之间没有太大区别。这两个操作都将创建 Actor 实现的新实例(调用 .ctor),然后调用 OnActivateAsync。它在执行分派给 Actor 的任何方法之前执行此操作。如果不在 Actor 的接口上调用方法,就无法创建 Actor 的实例,它都是底层 ActorBaseActorManager 消息处理的一部分。

此外,根据您为 actor 选择的持久性类型(NoneVolatilePersisted),托管 Actor 的 ActorService 会存储一个持久性密钥IActorStateProvider 与 Actor/ActorService 关联。这也是 ActorService "knows" 关于它的演员的方式。当您向 ActorService 询问已知 Actors 时,它会查询

的 StateProvider

如果您想运行一些初始化代码第一次,并且只有第一次激活 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);
    }