Akka Актер не завершает работу, если возникает исключение

В настоящее время я пытаюсь начать работу с 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 (исключение не создается), все работает нормально, и приложение завершает работу должным образом. Однако, как только я отправляю ему одно сообщение, которое приводит к исключению, приложение не завершается, потому что актор все еще работает, но я не могу понять, откуда он.

Если это помогает, это стек рассматриваемого потока:

  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 следует использовать только в крайнем случае, не так ли?

73
задан fresskoma 29 May 2011 в 20:25
поделиться