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 giriş yapmalarını sağlar. Ö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 girildiğinden izin verilir. Farklı bir çağrı bağlamının parçası olan diğer tüm iletiler, işlenmesi bitene kadar Aktör A'da engellenir.

Numaralandırmada ActorReentrancyMode tanımlanan aktör yeniden giriş için iki seçenek vardı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'nin 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