我正在尝试构建一个基于akka的系统,它会定期(每15秒)发送一次REST请求,对接收到的数据进行一些过滤,一些数据清理和验证,并保存到HDFS中。
以下是我写的代码。
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Flow, Sink, Source}
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.{HttpRequest, HttpResponse, StatusCodes}
import akka.actor.Props
import akka.event.Logging
import akka.actor.Actor
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Try
import akka.http.scaladsl.client.RequestBuilding._
/**
* Created by rabbanerjee on 4/6/2017.
*/
class MyActor extends Actor {
val log = Logging(context.system, this)
import scala.concurrent.ExecutionContext.Implicits.global
def receive = {
case j:HttpResponse => log.info("received" +j)
case k:AnyRef => log.info("received unknown message"+k)
}
}
object STest extends App{
implicit val system = ActorSystem("Sys")
import system.dispatcher
implicit val materializer = ActorMaterializer()
val ss = system.actorOf(Props[MyActor])
val httpClient = Http().outgoingConnection(host = "rest_server.com", port = 8080)
val filterSuccess = Flow[HttpResponse].filter(_.status.isSuccess())
val runnnn = Source.tick(
FiniteDuration(1,TimeUnit.SECONDS),
FiniteDuration(15,TimeUnit.SECONDS),
Get("/"))
.via(httpClient)
.via(filterSuccess)
.to(Sink.actorRef(ss,onCompleteMessage = "done"))
runnnn.run()
}
我目前面临的问题是,
即使我使用了重复/勾选来源,我也能看到一次结果。它没有重复发出请求。
我也试图找到50个这样的请求的结果分组,因为我将把它写入hadoop,我不能写每个请求,因为它会使HDFS充满多个文件。
答案 0 :(得分:3)
您没有消耗从HTTP调用中获得的响应。使用Akka HTTP,返回的实体字节是必须的,即使你对它们不感兴趣。
有关此内容的更多信息,请参阅docs。
在您的示例中,由于您没有使用响应实体,因此您可以丢弃其字节。见下面的例子:
val runnnn = Source.tick(FiniteDuration(1,TimeUnit.SECONDS),FiniteDuration(15,TimeUnit.SECONDS),Get("/"))
.via(httpClient)
.map{resp => resp.discardEntityBytes(); resp}
.via(filterSuccess)
.to(Sink.actorRef(ss,onCompleteMessage = "done"))