Reentraência do Reliable Actors
O runtime do Reliable Actors, por predefinição, permite a reentraência baseada no contexto da chamada lógica. Isto permite que os atores sejam reentrrantes se estiverem na mesma cadeia de contexto de chamada. Por exemplo, o Ator A envia uma mensagem para o Ator B, que envia uma mensagem para o Ator C. Como parte do processamento de mensagens, se o Ator C chamar o Ator A, a mensagem é reentrante, pelo que será permitida. Quaisquer outras mensagens que façam parte de um contexto de chamada diferente serão bloqueadas no Ator A até terminar o processamento.
Existem duas opções disponíveis para a reentraência de ator definidas na enumeração ActorReentrancyMode
:
LogicalCallContext
(comportamento predefinido)Disallowed
- desativa a reentraência
public enum ActorReentrancyMode
{
LogicalCallContext = 1,
Disallowed = 2
}
public enum ActorReentrancyMode
{
LogicalCallContext(1),
Disallowed(2)
}
A reentraência pode ser configurada nas definições de um ActorService
durante o registo. A definição aplica-se a todas as instâncias de ator criadas no serviço de ator.
O exemplo seguinte mostra um serviço de ator que define o modo de reentraência como ActorReentrancyMode.Disallowed
. Neste caso, se um ator enviar uma mensagem reentrante para outro ator, será emitida uma exceção do tipo 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;
}
}
}
Passos seguintes
- Saiba mais sobre a reentraência na documentação de referência da API de Ator)