2

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

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

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

4

2 回答 2

2

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

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

您还可以使用OnActivateAsync每次激活都会触发的方法。

在此处阅读有关 Actor 生命周期的更多信息。

于 2017-02-28T20:18:04.933 回答
0

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

此外,根据您为 Actor(或)选择的持久性类型,None托管Actor 的 ActorService 会存储一个与 Actor/ActorService 关联的持久性密钥。这也是 ActorService “知道”它的演员的方式。当您向 ActorService 询问已知 Actor 时,它会查询它的 StateProviderVolatilePersistedIActorStateProvider

如果您想第一次运行一些初始化代码并且仅在第一次激活 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);
    }
于 2017-03-02T07:02:15.310 回答