2017-06-28 3 views
1

j'ai un scala suivant snipet:ActorSystem.scheduler cesse de fonctionner après nombre d'événements

implicit val system = ActorSystem() 
implicit val materializer = ActorMaterializer() 
implicit val wsClient = AhcWSClient() 
import scala.concurrent.ExecutionContext.Implicits.global  

ActorSystem().scheduler.schedule(30.seconds, 5.minutes)(
{ 
    Logger.debug("5m tick") 
    /* more code */ 
} 

Il est une partie d'application domotique et il doit être exécuté à long terme pendant des mois entre le redémarrage.

En ce moment, il tiques toutes les 5 minutes, et produit un message d'enregistrement à la console et le fichier. Il y a aussi une méthode très simple qui fonctionne sous l'appel de Logger, mais il n'y a pas d'erreur.

Le problème est, après ~ 2-3 jours, les arrêts tic-tac. J'ai re-exécuté l'application plusieurs fois et il semble s'arrêter sans erreur, après cette période de temps. Je n'ai pas trouvé d'aide en ligne, alors j'espère que certains d'entre vous ont déjà rencontré le même problème et connaissent la réponse.

Merci,

Martin

Répondre

1

je ne peux pas vraiment dire ce que la question est que vous avez, mais pour le rendre plus transparent pour le débogage, vous pouvez utiliser une autre approche.

Utiliser un acteur à la place qui utilise scheduleOnce pour programmer un message à lui-même au lieu d'utiliser le schedule normal:

def receive: Unit = { 
    case "tick" => 
     Logger.debug("5m tick") 
     context.system.scheduler.scheduleOnce(5.minutes, self, "tick") 
} 

Dans le parent de cet acteur, vous pouvez utiliser la directive de surveillance Restart, donc dans le cas où l'acteur s'arrête, il est juste redémarré.

Une autre option serait de se pencher sur la Quartz-Scheduler qui est un peu plus large pour de longues tâches en cours d'exécution (et spécifiquement écrit pour ce contrairement à Akka)

+0

Merci @thwiegan, j'ai essayé le superviseur et le redémarrage approche . Redémarrer fonctionne comme un charme. –

+0

Je voulais savoir quel est le problème avec le programmateur de akka, donc je l'ai enroulé autour du code entier avec try-catch et a découvert qu'il semble que api 3ème partie, je vous appelle est un échec une fois dans quelques jours. La méthode elle-même ne réorganise pas un autre appel en cas d'échec précédent. Votre solution, cependant, enregistre la situation. Great, merci encore pour votre aide. –

+0

Bonne solution! Vous pouvez également faire 'horaire (0.minutes, 5.minutes, auto, « tick »)' dans cet acteur, qui devrait également continuer à envoyer des messages 'tick' même lorsque l'acteur est relancée en raison d'une exception. –