Ich versuche gerade mit Akka anzufangen und stehe vor einem seltsamen Problem. Ich habe den folgenden Code für meinen Schauspieler:
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);
}
}
Und so starte ich meine Arbeiter:
val workers = Vector.fill(nrOfWorkers)(actorOf[AkkaWorkerFT].start());
val router = Routing.loadBalancerActor(SmallestMailboxFirstIterator(workers)).start()
Und so schalte ich alles aus:
futures.foreach( _.await )
router ! Broadcast(PoisonPill)
router ! PoisonPill
Wenn ich jetzt die Worker-Nachrichten mit n> 0 sende (es wird keine Ausnahme ausgelöst), funktioniert alles einwandfrei und die Anwendung wird ordnungsgemäß heruntergefahren. Sobald ich jedoch eine einzelne Nachricht sende, die zu einer Ausnahme führt, wird die Anwendung nicht beendet, da noch ein Akteur ausgeführt wird, aber ich kann nicht herausfinden, woher sie stammt.
Falls es hilft, ist dies der Stapel des fraglichen Threads:
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: Der Thread, der nicht beendet wird, ist keiner der Arbeitsthreads, da ich einen PostStop-Rückruf hinzugefügt habe. Jeder von ihnen stoppt ordnungsgemäß.
PPS: Actors.registry.shutdownAll
Umgehung des Problems, aber ich denke, shutdownAll sollte nur als letztes Mittel verwendet werden, nicht wahr?