Sdílet prostřednictvím


Události objektu actor

Události objektu actor poskytují způsob, jak klientům odesílat oznámení o nejlepším úsilí od objektu actor. Události objektu actor jsou určené pro komunikaci mezi aktérem a klientem a neměly by se používat pro komunikaci mezi objekty actor-to-actor.

Následující fragmenty kódu ukazují, jak ve vaší aplikaci používat události objektu actor.

Definujte rozhraní, které popisuje události publikované objektem actor. Toto rozhraní musí být odvozeno z IActorEvents rozhraní. Argumenty metod musí být serializovatelné kontrakty dat. Metody musí vracet void, protože oznámení událostí představují jeden způsob a nejlepší úsilí.

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

Deklarujte události publikované objektem actor v rozhraní objektu actor.

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

Na straně klienta implementujte obslužnou rutinu události.

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 klientovi vytvořte proxy server pro objekt actor, který událost publikuje a přihlásí se k odběru událostí.

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

V případě převzetí služeb při selhání může objekt actor převzít služby při selhání do jiného procesu nebo uzlu. Proxy objektu actor spravuje aktivní předplatná a automaticky je znovu přihlásí k odběru. Interval opětovného předplatného můžete řídit prostřednictvím ActorProxyEventExtensions.SubscribeAsync<TEvent> rozhraní API. Pokud se chcete odhlásit, použijte ActorProxyEventExtensions.UnsubscribeAsync<TEvent> rozhraní API.

Na objektu actor publikujte události tak, jak k nim dojde. Pokud jsou k události odběratelé, modul runtime Actors jim odešle oznámení.

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

Další kroky