我目前正在尝试开始使用Akka,并且遇到了一个奇怪的问题。我的演员有以下代码:
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);
}
}
这就是我开始工作的方式:
val workers = Vector.fill(nrOfWorkers)(actorOf[AkkaWorkerFT].start());
val router = Routing.loadBalancerActor(SmallestMailboxFirstIterator(workers)).start()
这就是我关闭所有内容的方式:
futures.foreach( _.await )
router ! Broadcast(PoisonPill)
router ! PoisonPill
现在发生的情况是,如果我以n> 0(不引发异常)发送工作程序消息,则一切正常,并且应用程序正常关闭。但是,一旦我向它发送一条导致异常的消息,该应用程序就不会终止,因为仍然有一个actor正在运行,但是我不知道它来自何处。
如果有帮助,这是有问题的线程的堆栈:
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:没有终止的线程不是任何工作线程,因为我添加了一个postStop回调,它们中的每一个都正确停止。
PPS:Actors.registry.shutdownAll
解决此问题,但我认为shutdownAll仅应作为最后的手段使用,不是吗?