Sto lavorando ad attori di akka (JAVA) e di recente sono venuto a sapere che ci sono 3 modi (potrebbe essere più) per conoscere l'esistenza di un attore.Tre modi per conoscere l'esistenza di un attore akka
L'invio di un messaggio Identificare:
ActorSelection sel = actorSystem.actorSelection("akka://test/user/TestActor"); AskableActorSelection asker = new AskableActorSelection(sel); Future<Object> future = asker.ask(new Identify(1), new Timeout(5, TimeUnit.SECONDS)); ActorIdentity identity = (ActorIdentity) Await.result(future, timeOut.duration()); ActorRef reference = identity.getRef(); if(reference != null){ // Actor exists } else { // Actor does not exits }
metodo resolveOne:
ActorSelection sel = actorSystem.actorSelection("akka://test/user/TestActor"); Future<ActorRef> future = sel.resolveOne(new Timeout(5, TimeUnit.SECONDS)); // Wait for the completion of task to be completed. future.onComplete(new OnComplete<ActorRef>() { @Override public void onComplete(Throwable excp, ActorRef child) throws Throwable { // ActorNotFound will be the Throwable if actor not exists if (excp != null) { // Actor does not exists } else { // Actor exits } } }, actorSystem.dispatcher());
DeatchWatch: Creare un'altra chiamata attore getContext(). Watch (ActorRef di actorToWatch); e verificare la ricezione del messaggio Terminato. Questo può essere usato solo su attori già creati.
1,2 racconta esistenza di attore e 3 monitor. Mi piacerebbe conoscere i casi d'uso di questi tre e i loro effetti sulle caselle di posta degli attori e sulle funzionalità, in modo da poter scegliere il tipo adatto alla mia applicazione.
Verificare l'esistenza di un attore è una buona pratica? Se no perché?.
Generalmente, la necessità di sapere se un attore esiste è un odore di codice in una base di codice Akka. – Ryan
nel tuo primo esempio, a cosa si riferisce la variabile 'timeOut'? – KJ50
Timeout è il tempo di attesa per la risposta (timeout timeout = new Timeout (5, TimeUnit.SECONDS)) – achuth