Partilhar via


Eventos de ator

Os eventos de ator fornecem uma forma de enviar notificações de melhor esforço do ator para os clientes. Os eventos de ator são concebidos para comunicação actor-cliente e não devem ser utilizados para a comunicação actor-ator.

Os fragmentos de código seguintes mostram como utilizar eventos de ator na sua aplicação.

Defina uma interface que descreva os eventos publicados pelo ator. Esta interface tem de ser derivada da IActorEvents interface. Os argumentos dos métodos têm de ser serializáveis por contratos de dados. Os métodos têm de devolver nulos, uma vez que as notificações de eventos são unidirecionais e de 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 de 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();
}

Do lado do cliente, implemente o processador 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 subscreva os 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());

Em caso de ativações pós-falha, o ator pode efetuar a ativação pós-falha para um processo ou nó diferente. O proxy de ator gere as subscrições ativas e subscreve-as automaticamente. Pode controlar o intervalo de subscrição através da ActorProxyEventExtensions.SubscribeAsync<TEvent> API. Para anular a subscrição, utilize a ActorProxyEventExtensions.UnsubscribeAsync<TEvent> API.

No ator, publique os eventos à medida que acontecem. Se existirem subscritores do evento, o runtime dos Atores envia-lhes a notificação.

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

Passos seguintes