Reentrancy reliable Actors
Środowisko uruchomieniowe Reliable Actors domyślnie zezwala na ponowne wywoływanie logiczne oparte na kontekście. Dzięki temu aktorzy mogą być ponownie wychwytujący, 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 komunikatów, jeśli aktor C wywołuje aktora A, komunikat jest ponownie zwracany, więc będzie dozwolony. Wszelkie inne komunikaty, które są częścią innego kontekstu wywołania, będą blokowane w aktorze A do momentu zakończenia przetwarzania.
Dostępne są dwie opcje ponownego wyliczenia aktora zdefiniowane w wyliczeniem ActorReentrancyMode
:
LogicalCallContext
(zachowanie domyślne)Disallowed
— wyłącza ponowne logowanie
public enum ActorReentrancyMode
{
LogicalCallContext = 1,
Disallowed = 2
}
public enum ActorReentrancyMode
{
LogicalCallContext(1),
Disallowed(2)
}
Ponowne wprowadzenie można skonfigurować w ustawieniach użytkownika podczas ActorService
rejestracji. Ustawienie dotyczy wszystkich wystąpień aktorów utworzonych w usłudze aktora.
W poniższym przykładzie pokazano usługę aktora, która ustawia tryb ponownej enrancy na ActorReentrancyMode.Disallowed
wartość . W takim przypadku, jeśli aktor wyśle do innego aktora ponowną wiadomość, 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 ponownego logowania w dokumentacji interfejsu API aktora)
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla