Udostępnij za pośrednictwem


Wydarzenia aktora

Zdarzenia aktora zapewniają sposób wysyłania powiadomień o najlepszym wysiłku od aktora do klientów. Wydarzenia aktora są przeznaczone do komunikacji między aktorami i nie powinny być używane do komunikacji między aktorami.

Poniższe fragmenty kodu pokazują, jak używać zdarzeń aktora w aplikacji.

Zdefiniuj interfejs opisujący zdarzenia opublikowane przez aktora. Ten interfejs musi pochodzić z interfejsu IActorEvents . Argumenty metod muszą być możliwe do serializacji kontraktu danych. Metody muszą zwracać wartość void, ponieważ powiadomienia o zdarzeniach są jednym ze sposobów i najlepszego wysiłku.

public interface IGameEvents : IActorEvents
{
    void GameScoreUpdated(Guid gameId, string currentScore);
}
public interface GameEvents implements ActorEvents
{
    void gameScoreUpdated(UUID gameId, String currentScore);
}

Zadeklaruj wydarzenia opublikowane przez aktora w interfejsie aktora.

public interface IGameActor : IActor, IActorEventPublisher<IGameEvents>
{
    Task UpdateGameStatus(GameStatus status);

    Task<string> GetGameScore();
}
public interface GameActor extends Actor, ActorEventPublisherE<GameEvents>
{
    CompletableFuture<?> updateGameStatus(GameStatus status);

    CompletableFuture<String> getGameScore();
}

Po stronie klienta zaimplementuj procedurę obsługi zdarzeń.

class GameEventsHandler : IGameEvents
{
    public void GameScoreUpdated(Guid gameId, string currentScore)
    {
        Console.WriteLine(@"Updates: Game: {0}, Score: {1}", gameId, currentScore);
    }
}
class GameEventsHandler implements GameEvents {
    public void gameScoreUpdated(UUID gameId, String currentScore)
    {
        System.out.println("Updates: Game: "+gameId+" ,Score: "+currentScore);
    }
}

Na kliencie utwórz serwer proxy dla aktora, który publikuje zdarzenie i subskrybuje jego zdarzenia.

var proxy = ActorProxy.Create<IGameActor>(
                    new ActorId(Guid.Parse(arg)), ApplicationName);

await proxy.SubscribeAsync<IGameEvents>(new GameEventsHandler());
GameActor actorProxy = ActorProxyBase.create<GameActor>(GameActor.class, new ActorId(UUID.fromString(args)));

return ActorProxyEventUtility.subscribeAsync(actorProxy, new GameEventsHandler());

W przypadku przejścia w tryb failover aktor może przejść w tryb failover do innego procesu lub węzła. Serwer proxy aktora zarządza aktywnymi subskrypcjami i automatycznie je ponownie subskrybuje. Interwał ponownej subskrypcji można kontrolować za pomocą interfejsu ActorProxyEventExtensions.SubscribeAsync<TEvent> API. Aby anulować subskrypcję, użyj interfejsu ActorProxyEventExtensions.UnsubscribeAsync<TEvent> API.

Na aktorze opublikuj wydarzenia w miarę ich dziejów. Jeśli do zdarzenia są subskrybenci, środowisko uruchomieniowe aktorów wysyła im powiadomienie.

var ev = GetEvent<IGameEvents>();
ev.GameScoreUpdated(Id.GetGuidId(), score);
GameEvents event = getEvent<GameEvents>(GameEvents.class);
event.gameScoreUpdated(Id.getUUIDId(), score);

Następne kroki