異なるスケジュールで実行されるいくつかの Akka ジョブのセットがあります。最近、ディスクからファイルを読み取ってデータを処理する必要がある、1 日に 1 回実行するジョブをいくつか追加しました。ディスクからの読み取りはブロック操作であるため、私のコードは待機し、スケジュール操作が実行されるときにスケジュールされたジョブを実行しません。保留中のディスク IO 操作によってスケジューリング スレッドがブロックされないようにする方法を知っている人はいますか? 以下に、私のアクターの 1 つのコードを含めました。
スケジューラ コード:
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)) }
...
}
}