Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Środowisko uruchomieniowe Reliable Actors domyślnie zezwala na reentrantność opartą na kontekście wywołań logicznych. Dzięki temu aktorzy mogą mieć wielokrotne wejście, jeśli znajdują się w tym samym łańcuchu kontekstowym wywołań. Na przykład aktor A wysyła wiadomość do aktora B, który wysyła wiadomość do aktora C. W ramach przetwarzania wiadomości, jeśli aktor C wywołuje aktora A, wiadomość jest reentrantna, więc będzie dozwolona. Wszystkie inne komunikaty, które są częścią innego kontekstu wywołania, zostaną zablokowane w aktorze A do momentu zakończenia przetwarzania.
Dostępne są dwie opcje ponownego wejścia aktora zdefiniowane w enumeracji ActorReentrancyMode
:
-
LogicalCallContext
(zachowanie domyślne) -
Disallowed
— wyłącza ponowną cykliczność
public enum ActorReentrancyMode
{
LogicalCallContext = 1,
Disallowed = 2
}
public enum ActorReentrancyMode
{
LogicalCallContext(1),
Disallowed(2)
}
Reentrantność można skonfigurować w ustawieniach ActorService
podczas rejestracji. Ustawienie dotyczy wszystkich wystąpień aktora utworzonych w usłudze aktora.
W poniższym przykładzie pokazano usługę aktora, która ustawia tryb reentrancyjny na ActorReentrancyMode.Disallowed
. W takim przypadku, gdy aktor wyśle wiadomość do innego aktora, zostanie zgłoszony wyjątek typu FabricException
.
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;
}
}
}
Następne kroki
- Dowiedz się więcej na temat wejścia zwrotnego w dokumentacji referencyjnej interfejsu API aktora