Этот вопрос основан на проекте любимчика, который я сделал и это SO нить. В определении маршрута HTTP для Akka я запускаю длительный процесс и, естественно, хочу сделать это, не блокируя пользователя. Я могу добиться этого с помощью кода ниже:Как запустить график потоков Akka на отдельном диспетчере с таймаутом?
blocking-io-dispatcher {
type = Dispatcher
executor = "thread-pool-executor"
thread-pool-executor {
fixed-pool-size = 16
}
throughput = 1
}
complete {
Try(new URL(url)) match {
case scala.util.Success(u) => {
val src = Source.fromIterator(() => parseMovies(u).iterator)
src
.via(findMovieByTitleAndYear)
.via(persistMovies)
.toMat(Sink.fold(Future(0))((acc, elem) => Applicative[Future].map2(acc, elem)(_ + _)))(Keep.right)
// run the whole graph on a separate dispatcher
.withAttributes(ActorAttributes.dispatcher("blocking-io-dispatcher"))
.run.flatten
.onComplete {
_ match {
case scala.util.Success(n) => logger.info(s"Created $n movies")
case Failure(t) => logger.error(t, "Failed to process movies")
}
}
Accepted
}
case Failure(t) => logger.error(t, "Bad URL"); BadRequest -> "Bad URL"
}
}
чем проблема тогда, если я уже решил это? Проблема в том, что я не уверен, как установить тайм-аут. Выполнение графика создает Future
, который выполняется до завершения на выделенном blocking-io-dispatcher
. Если я добавлю вызов Await
, кодовые блоки. Есть ли способ установить тайм-аут?
Спасибо; но ваш код не компилируется, как показано. 'completTimeout' должен быть применен перед попыткой материализовать график (' toMat'). Я принял ваш ответ, как почти правильно. –