Reliable Actors yeniden giriş

Reliable Actors çalışma zamanı varsayılan olarak mantıksal çağrı bağlam tabanlı yeniden girişe izin verir. Bu, aktörlerin aynı çağrı bağlam zincirinde olmaları durumunda yeniden kaydolmalarına olanak tanır. Örneğin, Aktör A Aktör B'ye bir ileti gönderir ve bu da Aktör C'ye bir ileti gönderir. İleti işlemenin bir parçası olarak, Aktör C Aktör A'yı çağırırsa ileti yeniden eklenir, bu nedenle iletiye izin verilir. Farklı bir çağrı bağlamının parçası olan diğer tüm iletiler, aktör A'da işlenmesi bitene kadar engellenir.

Numaralandırmada ActorReentrancyMode aktör yeniden giriş için iki seçenek tanımlanmıştır:

  • LogicalCallContext (varsayılan davranış)
  • Disallowed - Yeniden giriş özelliğini devre dışı bırakır
public enum ActorReentrancyMode
{
    LogicalCallContext = 1,
    Disallowed = 2
}
public enum ActorReentrancyMode
{
    LogicalCallContext(1),
    Disallowed(2)
}

Kayıt sırasında bir ActorService'ın ayarlarında yeniden giriş yapılandırılabilir. Bu ayar, aktör hizmetinde oluşturulan tüm aktör örnekleri için geçerlidir.

Aşağıdaki örnekte, yeniden giriş modunu ActorReentrancyMode.Disallowedolarak ayarlayan bir aktör hizmeti gösterilmektedir. Bu durumda, bir aktör başka bir aktöre yeniden giriş iletisi gönderirse, türünde FabricException bir özel durum oluşturulur.

static class Program
{
    static void Main()
    {
        try
        {
            ActorRuntime.RegisterActorAsync<Actor1>(
                (context, actorType) => new ActorService(
                    context,
                    actorType, () => new Actor1(),
                    settings: new ActorServiceSettings()
                    {
                        ActorConcurrencySettings = new ActorConcurrencySettings()
                        {
                            ReentrancyMode = ActorReentrancyMode.Disallowed
                        }
                    }))
                .GetAwaiter().GetResult();

            Thread.Sleep(Timeout.Infinite);
        }
        catch (Exception e)
        {
            ActorEventSource.Current.ActorHostInitializationFailed(e.ToString());
            throw;
        }
    }
}
static class Program
{
    static void Main()
    {
        try
        {
            ActorConcurrencySettings actorConcurrencySettings = new ActorConcurrencySettings();
            actorConcurrencySettings.setReentrancyMode(ActorReentrancyMode.Disallowed);

            ActorServiceSettings actorServiceSettings = new ActorServiceSettings();
            actorServiceSettings.setActorConcurrencySettings(actorConcurrencySettings);

            ActorRuntime.registerActorAsync(
                Actor1.getClass(),
                (context, actorType) -> new FabricActorService(
                    context,
                    actorType, () -> new Actor1(),
                    null,
                    stateProvider,
                    actorServiceSettings, timeout);

            Thread.sleep(Long.MAX_VALUE);
        }
        catch (Exception e)
        {
            throw e;
        }
    }
}

Sonraki adımlar