Eventi relativi agli attoriActor events

Gli eventi relativi agli attori consentono l'invio di notifiche il più possibile accurate dall'attore ai client.Actor events provide a way to send best-effort notifications from the actor to the clients. Tali eventi sono progettati per la comunicazione tra attore e client e non è consigliabile usarli per la comunicazione tra attori.Actor events are designed for actor-to-client communication and shouldn't be used for actor-to-actor communication.

I frammenti di codice seguenti mostrano come usare eventi relativi agli attori nella propria applicazione.The following code snippets show how to use actor events in your application.

Definire un'interfaccia che descriva gli eventi pubblicati dall'attore.Define an interface that describes the events published by the actor. Tale interfaccia deve derivare dall'interfaccia IActorEvents .This interface must be derived from the IActorEvents interface. Gli argomenti dei metodi devono essere serializzabili in base al contratto dati.The arguments of the methods must be data contract serializable. I metodi devono restituire void, in quanto le notifiche degli eventi sono unidirezionali e sono il più accurate possibile.The methods must return void, as event notifications are one way and best effort.

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

Dichiarare gli eventi pubblicati dall'attore nella relativa interfaccia.Declare the events published by the actor in the actor interface.

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

Sul lato client implementare il gestore eventi.On the client side, implement the event handler.

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

Sul client creare il proxy per l'attore che pubblica l'evento e sottoscrivere gli eventi.On the client, create a proxy to the actor that publishes the event and subscribe to its events.

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

In caso di failover, l'attore può eseguire il failover su un processo o un nodo diverso.In the event of failovers, the actor may fail over to a different process or node. Il proxy dell'attore gestisce le sottoscrizioni attive e le rieffettua in modo automatico.The actor proxy manages the active subscriptions and automatically re-subscribes them. È possibile controllare l'intervallo di risottoscrizione tramite l'API ActorProxyEventExtensions.SubscribeAsync<TEvent> .You can control the re-subscription interval through the ActorProxyEventExtensions.SubscribeAsync<TEvent> API. Per annullare la sottoscrizione usare l' ActorProxyEventExtensions.UnsubscribeAsync<TEvent> API.To unsubscribe, use the ActorProxyEventExtensions.UnsubscribeAsync<TEvent> API.

Nell'attore pubblicare gli eventi man mano che si verificano.On the actor, publish the events as they happen. Se ci sono sottoscrittori dell'evento, il runtime di Actors invierà loro la notifica.If there are subscribers to the event, the Actors runtime sends them the notification.

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

Passaggi successiviNext steps