У меня есть набор из нескольких заданий Akka, которые работают в разных графиках. Недавно я добавил несколько заданий, которые должны выполняться один раз в день, которые требуют чтения файла с диска и обработки данных. Поскольку чтение с диска является блокировкой, мой код ждет и не выполняет никаких запланированных заданий при выполнении операции расписания. Кто-нибудь знает способ, которым поток планирования не должен блокироваться операциями ввода-вывода ожидающих операций? Я включил код одного из моих действующих лиц ниже.Планирование повторяющихся заданий с блокировкой операций
код планировщика:
lazy val system = akka.actor.ActorSystem("system")
lazy val emailActor = system.actorOf(Props[EmailActor], name = "EmailActor")
system.scheduler.schedule(3 hours, 24 hours)(emailActor ! System.currentTimeMillis)
Реализация актер:
class EmailActor extends Actor {
override def receive = {
case _ => EmailSyncer.process()
}
}
Процессор:
def process() = {
DataWarehouse.dataWarehouse withSession {
val file = "/some/file/name"
val emails = Try { Source.fromFile(file).getLines.map(l => Email(l)) }
...
}
}
изолят операция чтения в отдельный актер? – Ashalynd
Я считаю, что это то, что я делаю, планируя работу. С работами, которые я выполняю в настоящее время, они запускаются одновременно через один и тот же механизм планирования. –
Ну, если у вас есть несколько заданий, которые читаются с диска одновременно, и файлы, которые вы читаете, являются большими, единственная техника, о которой я могу думать, - это прочитать данные в (относительно небольших) кусках и контролировать выход после каждого фрагмента. – Ashalynd