我有一组以不同时间表运行的几个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)) }
...
}
}
答案 0 :(得分:3)
这是Akka的常见问题。因此,可以轻松获得解决它的模式。看看“Bulkheading”。我在下面写了一篇博文,向您展示了您需要做的事情。
一般的想法是,您可以将不同的角色放在不同的执行上下文或俚语“失败区域”中。这使您可以防止资源耗尽和其他问题流失到应用程序的其他部分。只有一个执行上下文会遇到饥饿,没有别的。
您还可以根据每个故障区域的作用来不同地调整线程池。通常,大量的线程用于阻塞操作和计算密集型的事情,每个核心的一个线程可以从那里开始和调整。
祝你好运。
http://letitcrash.com/post/40755146949/tuning-dispatchers-in-akka-applications