我有一组按不同时间表运行的几个 Akka 作业。最近,我添加了一些每天运行一次的作业,这些作业需要从磁盘读取文件并处理数据。因为从磁盘读取是一个阻塞操作,所以我的代码在执行计划操作时等待并且不运行任何计划作业。有谁知道调度线程不会被挂起的磁盘 IO 操作阻塞的方法?我在下面包含了我的一位演员的代码。
调度程序代码:
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)) }
...
}
}