使用Akka和Actors实现以下的正确方法是什么?
我需要调用远程REST服务并传递参数集和特定日期。 但我的应用程序正在获取输入参数和日期范围。 因此,如果日期范围是365天,则应用程序需要对远程服务进行365次调用,而不是处理所有输出数据(对于范围内的所有日期),并将此处理的结果保存在数据库中。
对REST服务的初始调用不会立即返回结果,而是返回一些“请求ID”。应用程序需要调用另一个REST API来检查请求状态,直到它“完成”。通过调用另一个REST API,它需要获得结果。
初始调用或任何后续调用可能只是失败而错误,应该在特定延迟后重试。
答案 0 :(得分:0)
akka中有一个比Actors
更直接的解决方案。这种类型的问题可以通过使用Streams的akka-http库来解决(使用Actors"在引擎盖下#34;)。
首先需要ActorSystem
和ActorMaterializer
:
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
implicit val actorSystem = ActorSystem()
implicit val actorMaterializer = ActorMaterializer()
import actorSystem.dispatcher
然后使用request-id服务establish a connection:
import scala.concurrent.Future
import akka.stream.scaladsl.{Source, Flow}
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
val idServiceUrl = "idServiceUrl.com"
val requestIDFlow : Flow[HttpRequest, HttpResponse, Future[Http.OutgoingConnection]] =
Http().outgoingConnection(idServiceUrl)
问题并未具体说明"参数集和特定日期"。它也没有具体说明这些参数和日期应如何形成HttpRequest:
type ParametersType = ???
type DateType = ???
def paramsToIDRequest(paramaters : ParametersType, date : DateType) : HttpRequest =
???
然后可以使用此方法查询request-id:
type IDType = ???
//converts the http response from the ID service into an ID
def httpResponseToID(httpResponse : HttpResponse) : IDType = ???
val requestIDFuture : Future[IDType] =
Source.single(parametersToIDRequest(...))
.via(requestIDFlow)
.map(httpRequestToID)
.runWith(Sink.head)
类似的技术可用于获取状态并最终获得结果......