scala play: как убить старых актеров / потоков при автоматическом перестроении?
У меня есть игровое приложение, где я использую актеров, которые выполняют постоянную работу / мониторинг.
например
class MyActor extends Actor {
def act() { while(true) { /* work */ } }
}
в моем коде я запускаю этого актера ровно один раз.
Моя проблема в том, что всякий раз, когда play автоматически перестраивает приложение (из-за изменений в исходном коде), оно создает нового Actor, но не избавляется от старого Actor. То же самое происходит, если использовать для мониторинга потоки (включая потоки демонов) вместо акторов.
Есть ли способ убить старых актеров / потоков при автоматическом перестроении, или альтернативно убедиться, что будет существовать только один актер (я попытался сделать поток актера object
, но это ничего не помогло), кроме перезапуска приложения вручную (я в порядке автоматически с перезапуском приложения при каждом изменении)?
Кроме того, есть ли лучший образец для фонового мониторинга в игре (очевидно, тот, который не будет создавать неконечные потоки).
Спасибо
1 ответ
Вы можете определить глобальный объект для прослушивания событий приложения (которые должны быть определены в пакете по умолчанию):
import play.api.GlobalSettings
object Global extends GlobalSettings {
override def onStart(application: play.api.Application) {
println("Starting actors")
MyActorSystem
}
override def onStop(application: play.api.Application) {
println("Stopping actors")
MyActorSystem.system.shutdown()
}
}
События остановки и запуска активируются при перезагрузке. Если вы используете внутреннюю систему актеров Play, я думаю, что вы можете использовать это вместо:
play.api.libs.concurrent.Akka.system.shutdown()