Akka 带有Source.tick的Http客户端
我正在尝试将http客户端连接到服务器公开的http服务,源应每1秒发送一次请求,我已将以下部分图装箱: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
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)您应该阅读这些文档,因为它们将提供比本文更多的知识:很好。。。我也在经历同样的事情。再次感谢