may*_*r86 30 scala akka spray scala-2.11 spray-client
我正在调用API,但大多数情况下我一直收到错误:" 自SSL连接已关闭后删除关闭 "和" 过早连接关闭(服务器似乎不支持请求流水线)". "就像90%的时间我得到了这个错误,这意味着:在非常罕见的情况下,查询会返回它应该的数据.
为了确保这不是API的服务器问题,我使用Node.js(Express和Request libs)复制相同的查询,并且它每次都有效.这让我几乎可以肯定是一个喷雾虫.
这是代码的示例:
case class MyClass(user: String, pass: String)
class MyActor extends Actor {
import spray.client.pipelining._
import spray.http.BasicHttpCredentials
import spray.http.{HttpRequest,HttpResponse}
import scala.concurrent.Future
import context.dispatcher
def receive = {
case myClass: MyClass => {
val credentials: BasicHttpCredentials = BasicHttpCredentials(myClass.user, myClass.pass)
val url: String = "https://myApi?params=values"
val request: HttpRequest = Get(url) ~> addCredentials(credentials)
val pipeline = sendReceive
val response: Future[HttpResponse] = pipeline(request)
val finalRes: Future[String] = response.map{ r =>
println(r)
r.entity.asString
}
finalRes pipeTo sender
}
} // end receive
} //end Actor
Run Code Online (Sandbox Code Playgroud)
错误明细:
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-8] a.i.TcpOutgoingConnection - Attempting connection to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] a.i.TcpOutgoingConnection - Connection established to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpClientConnection - Connected to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-9] s.c.c.HttpHostConnectionSlot - Connection to ... established, dispatching 1 pending requests
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - now monitoring Actor[akka://on-spray-can/system/IO-TCP/selectors/$a/5]
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpHostConnectionSlot - Dispatching GET request to /api?params=values across connection Actor[akka://on-spray-can/user/IO-HTTP/group-0/4]
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpHostConnectionSlot - now monitoring Actor[akka://on-spray-can/user/IO-HTTP/group-0/4]
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - Dropping Close since the SSL connection is already closing
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - Connection was PeerClosed, awaiting TcpConnection termination...
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] a.i.TcpOutgoingConnection - stopped
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - TcpConnection terminated, stopping
04/01 10:19:06 WARN [on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpHostConnectionSlot - Premature connection close (the server doesn't appear to support request pipelining) in response to GET request to /myApi?params=values with 1 retries left, retrying...
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - stopped
Run Code Online (Sandbox Code Playgroud)
我能够在所有这些版本中重现错误:
spray 1.0.1; akka 2.0.5; scala 2.9.3
spray 1.2.1; akka 2.2.4; scala 2.10.1
spray 1.3.1; akka 2.3.0; scala 2.10.3
spray 1.3.2; akka 2.3.6; scala 2.11.4
spray 1.3.3; akka 2.3.9; scala 2.11.6
Run Code Online (Sandbox Code Playgroud)
小智 1
如你所说,
\n\n\n\n\n为了确保这不是 API\xe2\x80\x99s 服务器问题,我使用 Node.js(Express 和 Request 库)复制相同的查询,并且每次都有效。这让我几乎可以肯定这是一个喷雾虫。
\n
你在scala中的代码使用HTTP管道功能发送请求,当你使用nodejs测试时,你是否使用HTTP管道功能发送请求?
\n\n对于错误消息:
\n\n\n\n\n服务器似乎不支持请求管道
\n
你应该确保:
\n\n如果您无法确保可以正确支持管道功能,则不应使用它。
\n\n以下资源可能会有所帮助:
\n\n\n\n\nHTTP 管道传输需要客户端和服务器都支持。\n 符合 HTTP/1.1 的服务器需要支持管道传输。这并不意味着服务器需要管道响应,而是如果客户端选择管道请求,服务器就不能失败。[7]
\n
https://en.wikipedia.org/wiki/HTTP_pipelined
\n\n\n\n\n现代浏览器中默认情况下不激活 HTTP 管道:
\n\n有问题的代理仍然很常见,这会导致奇怪且不稳定的行为,\n Web 开发人员无法轻松预见和诊断。\n 管道的正确实现非常复杂:\n 正在传输的资源大小、将使用的有效 RTT以及有效带宽对管道提供的改进有直接影响。如果不了解这些,重要的消息可能会延迟到不重要的消息之后。重要事件的概念在页面布局过程中不断演变!因此,HTTP 管道仅在大多数情况下带来边际改进。流水线会受到 HOL 问题的影响。由于这些原因,管道已被 HTTP/2 使用的更好的算法(多路复用)取代。
\n
https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x $revision/1330814
\n