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