Я пытаюсь использовать потоки вместо чистых актеров для обработки HTTP-запросов, и у меня есть следующий код:
trait ImagesRoute {
val log = LoggerFactory.getLogger(this.getClass)
implicit def actorRefFactory: ActorRefFactory
implicit def materializer: ActorMaterializer
val source =
Source
.actorRef[Image](Int.MaxValue, OverflowStrategy.fail)
.via(Flow[Image].mapAsync(1)(ImageRepository.add))
.toMat(Sink.asPublisher(true))(Keep.both)
val route = {
pathPrefix("images") {
pathEnd {
post {
entity(as[Image]) { image =>
val (ref, publisher) = source.run()
val addFuture = Source.fromPublisher(publisher)
val future = addFuture.runWith(Sink.head[Option[Image]])
ref ! image
onComplete(future.mapTo[Option[Image]]) {
case Success(img) =>
complete(Created, img)
case Failure(e) =>
log.error("Error adding image resource", e)
complete(InternalServerError, e.getMessage)
}
}
}
}
}
}
}
Я не уверен, что это правильный способ сделать это, или даже если это хороший подход, или если я должен использовать актера для взаимодействия с маршрутом, используя шаблон запроса, а затем внутри актера транслировать все.
Любые идеи?
ImageRepository.add
возвращаетFuture
; все, что вам нужно сделать, это написатьonComplete(ImageRepository.add(image))
, и все. - person Vladimir Matveev   schedule 21.09.2016