2017-10-16 11 views
0

J'utilise Akka Cluster et j'ai un problème intéressant. J'ai un acteur Actor1 sur le noeud A (akka.tcp: //[email protected]: 2554). Cet acteur trouve un autre acteur sur un autre nœud utilisantAkka Cluster - message provenant de lettres mortes?

val actor2sel = context.actorSelection(RootActorPath(m.address)/"user"/"actor2") 

m est membre du cluster. actor2sel est

ActorSelection[Anchor(akka.tcp://[email protected]:2553/), Path(/user/actor2)] 

Plus tard, actionneur1 transmet un message à Actor2, qui obtient le message correctement, mais l'expéditeur est deadLetters:

akka.tcp://[email protected]:2554/deadLetters 

Avez-vous le tout pointeur vous sur ce que la cause est peut-être?

Répondre

1

Transfert d'un message n'a de sens que s'il y a au moins trois acteurs de la chaîne du message:

actor1 --[sends Messsage1]--> actor2 --[forwards Message1]--> actor3 

En actor3:

def receive = { 
    case Message1 => 
    sender ! Response1 
} 

sender ci-dessus est une référence à actor1, compte tenu de ce qui précède chaîne de message.

S'il n'y a que deux acteurs, le transfert n'est pas le bon outil:

actor1 --[forwards Message1]--> actor2 

En actor2, si elle est transmise une Message1 de actor1, sans acteur « précédent » dans la chaîne de message, l'expéditeur sera lettre morte:

def receive = { 
    case Message1 => 
    sender ! Response1 
    // sender is dead letters if there are only two actors in the forwarding chain 
} 

Si actionneur1 ne reçoit pas le message d'un autre acteur avant de transmettre ce message à Actor2, ont simplement actionneur1 envoyer (!) le message à Actor2 au lieu de l'expédier.

Si Actor1 reçoit le message d'un autre acteur avant de le transmettre, assurez-vous que cet acteur "précédent" est en cours d'exécution avant que Actor2 accède à sender.