我有一组按不同时间表运行的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)) }
...
}
}
最佳答案
这是Akka中的常见问题。因此,很容易找到解决它的模式。查看“隔板”。我在下面提供了一篇博客文章,向您显示了您需要做什么。
通常的想法是,您可以将不同的参与者放在不同的执行上下文或or语“故障区域”中。这使您可以防止资源耗尽和其他问题流到应用程序的其他部分。只有一个执行上下文会饿死,其他都没有。
您还可以根据每个故障区域的操作来不同地调整线程池。通常,大量线程用于阻塞操作和计算密集型事情,因此从那里启动和调整每个内核只有一个线程。
祝好运。
http://letitcrash.com/post/40755146949/tuning-dispatchers-in-akka-applications
关于scala - 使用阻塞操作计划重复作业,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19986119/