Я думаю, вам следует пересмотреть вопрос об использовании актеров для тяжелого доступа к IO. Учитывая, что вы используете диспетчер по умолчанию, вы можете заблокировать его с помощью операций ввода-вывода, и это замедлит всю систему субъекта.
Если вы все еще хотите продолжить, рекомендуем выполнить следующие действия:
- Создать нового диспетчера и назначить его своему актеру. См. docs для справки
- Используйте блок try / finally для закрытия ресурсов (да, обычный старый try / catch / finally)
override def receive: Receive = {
case FILEIO(path) => {
val ios = fs.create(new Path(path))
try {
// ios.read/write ..
// exception could occur
} finally {
ios.close()
}
}
}
В качестве альтернативы, извлечениеваша работа ввода-вывода в асинхронном контексте, например Future
, которая должна выполняться в выделенном контексте выполнения и использовать шаблон pipeTo
для обработки результатов с помощью Actor.