Je suis en train d'essayer de démarrer avec Akka et je suis confronté à un problème bizarre. J'ai le code suivant pour mon Acteur:
class AkkaWorkerFT extends Actor {
def receive = {
case Work(n, c) if n < 0 => throw new Exception("Negative number")
case Work(n, c) => self reply n.isProbablePrime(c);
}
}
Et c'est de cette façon que je commence mes travailleurs:
val workers = Vector.fill(nrOfWorkers)(actorOf[AkkaWorkerFT].start());
val router = Routing.loadBalancerActor(SmallestMailboxFirstIterator(workers)).start()
Et c'est de cette façon que je ferme tout bas:
futures.foreach( _.await )
router ! Broadcast(PoisonPill)
router ! PoisonPill
Maintenant ce qui se passe est que si j'envoie les travailleurs des messages avec n > 0 (aucune exception n'est levée), tout fonctionne bien et l'application s'arrête correctement. Cependant, dès que je l'ai envoyer un seul message qui entraîne une exception, l'application ne met pas fin car il y a toujours un acteur de course, mais je n'arrive pas à comprendre d'où il vient.
Dans le cas où il aide, c'est la pile du thread en question:
Thread [akka:event-driven:dispatcher:event:handler-6] (Suspended)
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: 158
AbstractQueuedSynchronizer$ConditionObject.await() line: 1987
LinkedBlockingQueue<E>.take() line: 399
ThreadPoolExecutor.getTask() line: 947
ThreadPoolExecutor$Worker.run() line: 907
MonitorableThread(Thread).run() line: 680
MonitorableThread.run() line: 182
PS: Le thread qui n'est pas appelé à disparaître n'est pas tout les threads de travail, parce que j'ai ajouté un postStop rappel, chacun d'eux s'arrête correctement.
PPS: Actors.registry.shutdownAll
solutions de contournement du problème, mais je pense que shutdownAll ne doit être utilisé qu'en dernier recours, n'est-ce pas?