我有一组按不同时间表运行的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/

10-09 15:19
查看更多