Остановка повторяющегося запланированного сообщения - PullRequest
0 голосов
/ 28 января 2020

Мы хотим, чтобы актер остановился сам после некоторого периода бездействия (то есть после того, как он не получил определенного вида сообщения в течение x минут). Я не вижу встроенной поддержки для этого, поэтому я решил использовать планировщик.

Актер сам назначает себе запланированное сообщение, как показано ниже:

Context
    .System
    .Scheduler
    .ScheduleTellRepeatedly(_expiryInterval, _expiryInterval, Self, new ExpiryCheckMessage(), Self);

При получении этого сообщения:

Receive<ExpiryCheckMessage>(x => {
    if(IsExpired())
    {
        Context.Stop(Self);
    }
});

Но после истечения срока действия и остановки актера отправка запланированных сообщений приводит к возникновению тупиков.

Каков наилучший способ остановить запланированное сообщение в это дело?

1 Ответ

1 голос
/ 29 января 2020

Примечание: я знаком с Akka на JVM, а не на. Net.

Из документов Akka для ScheduleTellRepeatedly кажется, что есть необязательный параметр cancelable типа ICancelable. Поэтому я хотел бы представить что-то вроде (это буквально первый C#, который я когда-либо пытался написать, поэтому заранее извиняюсь):

// Somewhere in the actor's scope
var cancellationKey = new Cancelable(Context.System.Scheduler);

Context
    .System
    .Scheduler
    .ScheduleTellRepeatedly(
        _expiryInterval,
        _expiryInterval, 
        Self,
        new ExpiryCheckMessage(),
        Self, 
        cancellationKey
    );

Receive<ExpiryCheckMessage>(x =>
    if (IsExpired()) {
        cancellationKey.Cancel();
        Context.Stop(Self);
    }
}
...