Partilhar via


Eventos para atores

Os eventos do ator fornecem uma maneira de enviar notificações de melhor esforço do ator para os clientes. Os eventos de atores são projetados para comunicação entre atores e não devem ser usados para comunicação entre atores.

Os trechos de código a seguir mostram como usar eventos de ator em seu aplicativo.

Defina uma interface que descreva os eventos publicados pelo ator. Esta interface deve ser derivada da IActorEvents interface. Os argumentos dos métodos devem ser serializáveis por contrato de dados. Os métodos devem retornar vazios, pois as notificações de eventos são uma maneira e o melhor esforço.

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

Declare os eventos publicados pelo ator na interface do ator.

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();
}

No lado do cliente, implemente o manipulador de eventos.

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);
    }
}

No cliente, crie um proxy para o ator que publica o evento e inscreva-se em seus eventos.

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());

No caso de failovers, o ator pode fazer failover para um processo ou nó diferente. O proxy do ator gerencia as assinaturas ativas e as reinscreve automaticamente. Você pode controlar o intervalo de reinscrição por meio da ActorProxyEventExtensions.SubscribeAsync<TEvent> API. Para cancelar a inscrição, use a ActorProxyEventExtensions.UnsubscribeAsync<TEvent> API.

Sobre o ator, publique os eventos à medida que eles acontecem. Se houver assinantes do evento, o tempo de execução do Actors enviará a notificação.

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

Próximos passos