2012-05-01 5 views
2

Использование scala.actors.Actor.self создает ForkJoinScheduler, который прилипает вокруг и сохраняет программу от завершения нормально. Я бы хотел использовать актеров Scala в программе, написанной на Java, и в настоящее время использует пул потоков, который изящно прекращается. Было бы идеально, если бы я мог принуждать Актер использовать DaemonScheduler, но в случае необходимости я был бы рад предоставить явную команду завершения.Изящно завершение программы Scala после использования Actor.self

Вот некоторые примеры кода:

object EchoActor extends DaemonActor { 
    def act() { 
    loop { 
     react { 
     case (x: Any, respondTo: Actor) => { 
      println("echoActor Got message " + x) 
      respondTo ! "Echoing: " + x 
     } 
     case msg => println("Can't handle message " + msg) 
     } 
    } 
    } 
} 

object TestRunner extends App { 
    EchoActor.start() 
    for (n <- 1 to 3) { 
    EchoActor !("Time to echo", self) 
    println(self.receiveWithin(1000) { case x => x}) 
    Actor.clearSelf() // <<-- This doesn't allow for graceful shutdown 
    } 
    Actor.resetProxy() // <<-- Neither does this 
    println("Done.") 
} 

Эта программа не завершается, даже если нет никаких потоков не осталось, которые могли бы использовать Actor.self. Я пробовал позвонить Actor.exit(), который просто бросает InterruptedException, и я вот-вот полностью откажусь от Actor.self. Я что-то упускаю?

Update

Просто обнаружил:

scala.actorsScheduler.shutdown() 

, который работает для глобального прекращения, и получить работу на данный момент. Я бы предпочел изменить планировщик по умолчанию как DaemonScheduler, поэтому, пожалуйста, напишите ответ, если вы знаете, как это сделать.

ответ

0

Что само по себе дает вам ActorProxy. У ActorProxy есть пустой receive и метод exit, о котором вы уже упоминали. Все остальное унаследовано от Actor. Я думаю, что единственный способ закрыть его - это позвонить exit и поймать исключение.

0

Отправить сообщение для актера, чтобы выйти, например, «выйти» или сопутствующий объект «Выход». В частичной функции, которая реагирует на сообщения, то есть на блок реакции, вызывается метод exit(). Прекрасно подходит для меня, и мое приложение закрывается грациозно.

Смежные вопросы