2013-11-14 2 views
3

У меня есть набор из нескольких заданий Akka, которые работают в разных графиках. Недавно я добавил несколько заданий, которые должны выполняться один раз в день, которые требуют чтения файла с диска и обработки данных. Поскольку чтение с диска является блокировкой, мой код ждет и не выполняет никаких запланированных заданий при выполнении операции расписания. Кто-нибудь знает способ, которым поток планирования не должен блокироваться операциями ввода-вывода ожидающих операций? Я включил код одного из моих действующих лиц ниже.Планирование повторяющихся заданий с блокировкой операций

код планировщика:

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

изолят операция чтения в отдельный актер? – Ashalynd

+0

Я считаю, что это то, что я делаю, планируя работу. С работами, которые я выполняю в настоящее время, они запускаются одновременно через один и тот же механизм планирования. –

+0

Ну, если у вас есть несколько заданий, которые читаются с диска одновременно, и файлы, которые вы читаете, являются большими, единственная техника, о которой я могу думать, - это прочитать данные в (относительно небольших) кусках и контролировать выход после каждого фрагмента. – Ashalynd

ответ

3

Это общая проблема в Акку. И поэтому шаблон для его решения легко доступен. Посмотрите на «Переборку». Я добавил сообщение в блоге ниже, в котором показано, что именно вы должны делать.

Общая идея заключается в том, что вы можете поместить разных участников в различные контексты исполнения или в сленговые «зоны отказа». Это позволяет вам сдерживать истощение ресурсов и другие проблемы от кровотечения в другие части вашего приложения. Только один контекст исполнения поражает голод, больше ничего.

Вы также можете настроить пулы потоков по-разному на основе того, что делает каждая зона отказа. Как правило, большое количество потоков для блокировки операций и для интенсивных вычислений вещей, это будет один поток на ядро, чтобы начать и настроить оттуда.

Удачи.

http://letitcrash.com/post/40755146949/tuning-dispatchers-in-akka-applications

+0

Оказалось, что блокировка ввода-вывода не была моей проблемой. Было исключение, в котором никогда не было напечатано трассировка стека. Тем не менее, этот ответ был очень полезен, помогая мне узнать об обработке истощения ресурсов в Акке. Из-за этого я дам вам принятый ответ. –

+0

Спасибо =) Держите его в заднем кармане, как только ваше приложение станет большим. Может иметь огромное значение для производительности и отказоустойчивости. –

Смежные вопросы