Akka 带有Source.tick的Http客户端

Akka 带有Source.tick的Http客户端,akka,akka-stream,akka-http,Akka,Akka Stream,Akka Http,我正在尝试将http客户端连接到服务器公开的http服务,源应每1秒发送一次请求,我已将以下部分图装箱: def httpSourceGraph() = { Source.fromGraph(GraphDSL.create() { implicit builder => val sourceOutLet = builder.add(Source.tick(FiniteDuration(0, TimeUnit.SECONDS), FiniteDuration(1, T

我正在尝试将http客户端连接到服务器公开的http服务,源应每1秒发送一次请求,我已将以下部分图装箱:

def httpSourceGraph() = {
  Source.fromGraph(GraphDSL.create() { implicit builder =>
    val sourceOutLet = builder.add(Source.tick(FiniteDuration(0, TimeUnit.SECONDS), FiniteDuration(1,
      TimeUnit.SECONDS),
      HttpRequest(uri ="/test", method = HttpMethods.GET))).out
    // expose outlet
    SourceShape(sourceOutLet)
  })
}

def httpConnFlow() = {
  Flow.fromGraph(GraphDSL.create() { implicit builder =>

    val httpSourceFlow = builder.add(Http(system).outgoingConnection(host = "localhost", port = 8080))

    FlowShape(httpSourceFlow.in, httpSourceFlow.out)
  })
}
该图由以下部分组成:

val response= httpSourceGraph.via(httpConnFlow()).runForeach(println)
如果http服务器(localhost:8080/test)已启动并运行,则一切正常,每1秒我就可以看到服务器返回的响应。我无法在服务器停机或稍后停机的情况下做出任何响应

我认为它应该给我以下错误:

akka.stream.StreamTcpException:Tcp命令[Connect(localhost/127.0.0.1:8080,无,List(),部分(10秒),true)]失败

这也可以用一些错误的url进行测试。(域名stackoverflow1.com和错误的url“/test”)

谢谢你的帮助


-阿伦

我可以提出一种方法来获得你想要的行为。我认为您的问题的核心是
Http()生成的
Flow
。当遇到故障时,outgoingConnection
将终止。一旦发生这种情况,就不再需要从
中提取请求,整个流程就停止了。如果希望无论连接是否丢失,都能继续向下游发射元素,那么可以尝试使用主机连接池,而不仅仅是单个连接。该池对于单个连接的故障具有更强的恢复能力,而且它还可以从一开始就设置为向下游发送
Success
Failure
。使用主机连接池的流的简化版本可以定义如下:

 val source = 
   Source.tick(
     1 second, 
     5 second, 
     (HttpRequest(uri ="/", method = HttpMethods.GET), 1)
   )

 val connFlow = Http(system).
   newHostConnectionPool[Int](host = "www.aquto.com", port = 80)

 val sink = Sink.foreach[(util.Try[HttpResponse], Int)]{
   case (util.Success(r), _ ) => 
     r.entity.toStrict(10 seconds)
     println(s"Success: ${r.status}")

   case (util.Failure(ex), _) => 
     println(s"Failure: ${ex.getMessage}")
 }

source.via(connFlow).to(sink).run

我测试了,在测试的中间拔出我的网络连接,这就是我看到的输出:

Success: 200 OK
Success: 200 OK
Failure: Tcp command [Connect(www.aquto.com/50.112.131.12:80,None,List(),Some(10 seconds),true)] failed
Failure: Tcp command [Connect(www.aquto.com/50.112.131.12:80,None,List(),Some(10 seconds),true)] failed
Failure: Tcp command [Connect(www.aquto.com/50.112.131.12:80,None,List(),Some(10 seconds),true)] failed
Success: 200 OK
Success: 200 OK

为什么返回元组(response,int)。我更喜欢只响应。池的设置允许您一次将多个并发请求下推到池中。当您这样做时,对出来的响应没有顺序保证(即顺序输入不一定等于顺序输出)。这就是元组上的第二个插槽的用途,但对于您的情况,您不是一次传入多个请求,而是只执行一个请求,因此,该id在请求端被设置为1,而在响应处理中被完全忽略。非常感谢。。它与使用Http(系统)有何不同。outgoingConnection(host=“localhost”,port=8080)您应该阅读这些文档,因为它们将提供比本文更多的知识:很好。。。我也在经历同样的事情。再次感谢