2013-09-24 7 views
5

Ecco cosa sto trovando, e per la vita di me non riesco a individuare il motivo. Sto creando degli attori "di stampa" che sostanzialmente non fanno nulla o stampano un messaggio in base al tipo di messaggio che ricevono."Le lettere morte si incontrano" non appena gli attori sono collocati nel router

class Printer extends Actor { 
    def receive = { 
     case m: SomeMessage => println(m.text) 
     case _ => 
    } 
} 

Sto creando diversi di questi attori:

val actor4 = system.actorOf(Props[Printer], "t-4") 
val actor5 = system.actorOf(Props[Printer], "t-5") 
val actor6 = system.actorOf(Props[Printer], "t-6") 

e gettandoli in un vettore:

val routees2 = Vector[ActorRef](actor4, actor5, actor6) 

che sto facendo quanto sopra in modo che io possa gettare nella un router (e saranno sotto il controllo del router). Quando eseguo le specifiche fino a questo punto, non ho alcun problema. Non appena li metto in un router ed eseguo le specifiche, sto avendo problemi. Ecco il router:

val router = system.actorOf(Props[Printer].withRouter(
    BroadcastRouter(routees = routees2)), "router-to-transformers") 

Ora, quando ho eseguito le specifiche che ho tutti i tipi di lettere morte ...

[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout 
er-to-transformers#-1845250548] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 
[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout 
er-to-transformers#-1845250548] was not delivered. [2] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 
[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout 
er-to-transformers#-1845250548] was not delivered. [3] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

Per la vita di me non riesco a capire cosa sta succedendo qui . Ho aggiunto un link a uno snippet del test. La numerazione, nello snippet, è strana perché ho tagliato diversi tentativi che sono stati commentati in modo da non ingombrare lo snippet. Mi sono concentrato su questo tema dead-lettere perché mi sento come quando ho aggiunto un più attori e in realtà iniziato a passare i messaggi in giro, le cose non sono stati sempre consegnati ... http://snipt.org/AhVf0

Vale la pena chiedono che questi attori sono Locale. Ho letto qualcosa sull'attorePer essere ammortizzato e mi chiedo se venga usato e in parte è ciò che sta causando i miei problemi? Ci sono così tante parti mobili qui però e non molta documentazione stabile, COMPLETA. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

7

Quello che vedete qui è che DeathWatchNotifications non viene elaborato, nel senso che l'attore (il router) stava ancora guardando i suoi figli quando terminava. Questo non è automaticamente un segno di problemi as documented (ma dovremmo renderlo più chiaro nel caso di questo particolare messaggio). In questo caso, l'unico modo per sbarazzarsi di questo messaggio è assicurarsi che il router e le rotte non terminino "allo stesso tempo".

+1

Invece di usare il: router val = system.actorOf (Props (CreateDiagnostic) .withRouter '(BroadcastRouter (routees = routees2)), sintassi "router") 'Sono passato a:' val router = system.actorOf (Puntatori (createDiagnostic) .withRouter (BroadcastRouter (nrOfInstances = 3)), "router") 'che ha reso il dead -Le lettere vanno via. Suppongo che questa seconda implementazione sia il modo più semplice per farlo? Come sempre, grazie. – MCP

3

Ho avuto lo stesso problema con il mio progetto akka. Ecco la mia domanda "Dead Letters encountered" error while running AKKA remote actors

Generalmente la lettera morta incontrata si verifica quando non c'è più attore lavoratore a ricevere il messaggio inviato dal master. Dovresti assicurarti che il tuo attore lavoratore sia vivo quando il tuo padrone gli sta inviando un'attività o un messaggio.

1

Una soluzione è quella di utilizzare il Scheduler, e invece di

context.stop(self) 

uso:

system.scheduler.scheduleOnce(1 second) { 
    self ! PoisonPill 
} 
Problemi correlati