如何使用Actors和Akka实现简单的协议?

时间:2014-10-14 22:22:10

标签: scala protocols akka fsm

使用Akka和Actors实现以下的正确方法是什么?

我需要调用远程REST服务并传递参数集和特定日期。 但我的应用程序正在获取输入参数和日期范围。 因此,如果日期范围是365天,则应用程序需要对远程服务进行365次调用,而不是处理所有输出数据(对于范围内的所有日期),并将此处理的结果保存在数据库中。

对REST服务的初始调用不会立即返回结果,而是返回一些“请求ID”。应用程序需要调用另一个REST API来检查请求状态,直到它“完成”。通过调用另一个REST API,它需要获得结果。

初始调用或任何后续调用可能只是失败而错误,应该在特定延迟后重试。

1 个答案:

答案 0 :(得分:0)

akka中有一个比Actors更直接的解决方案。这种类型的问题可以通过使用Streams的akka-http库来解决(使用Actors"在引擎盖下#34;)。

首先需要ActorSystemActorMaterializer

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)

类似的技术可用于获取状态并最终获得结果......