2016-09-13 1 views
1

J'ai un enfant "consommateur" acteur qui se connecte à un flux de données externe, analyse ses messages et les transmet plus loin dans l'application. Ce système "producteur" a une architecture pub-sub, mais ne restaure pas les abonnements après la reconnexion. Actuellement, je stocke ces abonnements dans l'acteur parent et je les renvoie dans le superviseur, mais le problème est que pendant le redémarrage de l'enfant, ils sont redirigés vers la file d'attente des lettres mortes. J'aurais pu essayer de les programmer à parent après un certain délai, mais cela peut interférer avec l'ordre d'abonnement, ce qui est important.Renvoyer le message "init" sur le redémarrage de l'acteur Akka

Alors, comment envoyer ces messages de "réabonnement" à l'enfant pendant qu'il redémarre?

+0

Si cela est important, l'enfant est supervisé par 'BackoffSupervisor' avec' Backoff.onFailure (...). WithSupervisorStrategy (resubscribingStrategy) ' – fghkngfdx

Répondre

1

Vous pouvez utiliser Restart Hooks (http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Restart_Hooks): preRestart et postRestart api. Sur preRestart sur l'acteur enfant, vous devez informer le superviseur que l'acteur enfant va redémarrer et que le superviseur doit suspendre l'envoi du message. Sur postRestart sur l'acteur enfant, vous devez informer le superviseur que l'enfant est disponible et que le superviseur doit reprendre l'envoi du message.

+0

N'y a-t-il pas une course entre l'envoi d'un enfant «Je redémarre» et l'envoi du parent à l'enfant? – tariksbl

+0

Oui il y a mais il s'agit d'implémenter le bon protocole, le parent ne doit pas envoyer un message à l'enfant si l'enfant n'a pas encore reconnu que le message précédent est déjà en cours. –

0

Vous pouvez vous abonner à des lettres mortes avec

context.system.eventStream.subscribe(myListenerActorRef, classOf[DeadLetter]) 
... 
def receive = { 
    case DeadLetter(msg, from, to) => 
    //Do my custom stuff here 
} 

, magasin et les envoyer à nouveau.

+0

Mais cela va me faire avoir deux messages" files d'attente ", potentiellement compromettre leur commande . Y a-t-il un moyen de programmer un message sur le début d'un acteur, sans essayer de l'envoyer à l'incarnation mourante et d'essayer de retraiter ses rejets? – fghkngfdx

+0

Possible hack - introduit l'état 'listensDeadletters/listensRegular' dans le redémarrage de l'acteur. Cependant, une meilleure solution est d'avoir un pool d'acteurs, donc redémarrer l'un d'entre eux ne sera pas nuisible. – dveim