2014-04-28 13 views
9

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

  1. 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 
    } 
    
  2. 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()); 
    
  3. 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é?.

+1

Generalmente, la necessità di sapere se un attore esiste è un odore di codice in una base di codice Akka. – Ryan

+0

nel tuo primo esempio, a cosa si riferisce la variabile 'timeOut'? – KJ50

+0

Timeout è il tempo di attesa per la risposta (timeout timeout = new Timeout (5, TimeUnit.SECONDS)) – achuth

risposta

4

Beh, c'è solo un modo per sapere se un attore esisteva ad un certo punto nel passato: se si riceve un messaggio da esso. Tutto quanto sopra sono solo variazioni su questo tema.

Detto questo, una volta che hai l'ActorRef, è possibile utilizzare Deathwatch ricevere una notifica di terminazione che dell'attore. Ma non avendo ancora ricevuto il messaggio Terminato non significa che l'attore è ancora in vita: il Terminato potrebbe già essere sulla buona strada.

Pensa agli attori come a persone che possono comunicare solo inviando email. Questa analogia funziona abbastanza bene per la semantica della loro interazione.

+0

Grazie @Roland Kuhn per "solo un modo per sapere se esisteva un attore a un certo punto nel passato"" – achuth

+0

ho pensato ogni delle funzionalità di cui sopra funziona senza inviare un messaggio all'attore, quindi alla fine tutto il lavoro sopra riportato invia e riceve solo messaggi all'attore. – achuth

Problemi correlati