2015-11-25 3 views
4

В erlang вы можете передать исходное состояние актеру при его нерестах. Таким образом, вам не нужно иметь дело с сообщениями init, которые снова возвращают актер в его исходное состояние или сообщения, для которых требуется сообщение init. В orleans, когда предположение о зернах всегда существует, вы не можете использовать конструкторы. Есть ли способ передать начальное состояние зернам, избегая, таким образом, любого метода init, который нарушает согласованность, требуя его вызова до любого другого метода?Как я могу обеспечить согласованность зерен orleans?

Когда я говорю «возьмите актер в его исходное состояние», я имею в виду, в контексте orleans, метод вызова init для активации определенной зернистости дважды. Это похоже на состояние перезаписи. Может быть, вам нужен этот король сообщения, который перезагружает состояние, но если вам это не нужно, это ловушка, потенциальный источник ошибок.

Я ищу некоторый тип конструктора, что-то вроде spawn(module, function, [initial state]) от erlang. Моей первой попыткой был поиск любой перегрузки GetGrain со следующей подписью: GrainFactory.GetGrain<IGrain>(id, initialState);

+0

Возможно, я что-то не понял, но вы написали: «Начальное состояние снова» и «Зерна всегда существуют». Вы должны использовать новый идентификатор зерна для нового «первого» сообщения, и новое зерно будет создано с нулевым состоянием. «Всегда существует» не означает, что существует только одно зерно данного типа, это означает, что зерно с данным идентификатором никогда не создавалось и не удалялось вручную, но структура создает их, когда данный идентификатор используется впервые. – lmagyar

+0

Is 'OnActivateAsync()' что вы ищете? Кажется, он вызывается всякий раз, когда активируется экземпляр зерна, поэтому вы можете инициализировать его поля. Но я не мог найти для этого никакой надлежащей документации. – svick

+0

Нет, это не то, что я ищу. OneActivateAsync() не ожидает каких-либо параметров, это просто обратный вызов события, чтобы что-то сделать, когда зерно активировано. Я ищу некоторый тип конструктора, что-то вроде 'spawn (модуль, функция, [начальное состояние])' от erlang. Моя первая попытка - найти любую перегрузку GetGrain со следующей подписью: «GrainFactory.GetGrain (id, initialState);' –

ответ

3

Как @svick предлагает, OnActivateAsync - лучший подход для загрузки начального состояния для зерна.

public class ExampleGrain : Orleans.Grain, IExampleGrain 
{ 

    public override Task OnActivateAsync() 
    { 
     // set initial state for grain 
     return base.OnActivateAsync(); 
    } 

... 

Этот метод будет называться каждый раз, когда зерно инициализируется (не только в первый раз). Вы могли бы использовать инфраструктуру Стойкости, встроенную в Орлеан, чтобы записать, было ли зерно было создано ранее (возможно, используя логическое свойство состояния вашего класса), т.е.

public class ExampleGrainState : GrainState 
{ 
    public bool Initialised { get; set; } 
} 

[StorageProvider(ProviderName = "Storage")] 
public class QuadKeyGrain : Orleans.Grain<ExampleGrainState>, IExampleGrain 
{ 
    public override async Task OnActivateAsync() 
    { 
     if (!this.State.Initialised) 
     { 
      // do initialisation 
      this.State.Initialised = true; 
      await this.WriteStateAsync(); 
     } 
     await base.OnActivateAsync(); 
    } 

Смотрите этот учебник для получения дополнительной информации о персистенции:

http://dotnet.github.io/orleans/Tutorials/Declarative-Persistence.html

Смежные вопросы