我有一組幾個在不同計劃下運行的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)) }
...
}
}
將閱讀操作隔離爲單獨的演員? – Ashalynd
我相信這就是我在安排工作時所做的。通過我目前正在運行的作業,它們通過相同的調度機制同時運行。 –
好吧,如果你有幾個同時從磁盤讀取的作業,並且你正在讀取的文件很大,我能想到的唯一技術就是在每個塊之後讀取(相對較小的)數據塊中的數據並進行控制。 – Ashalynd