Использование 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, поэтому, пожалуйста, напишите ответ, если вы знаете, как это сделать.