如何修复Dropping Close,因为SSL连接已经关闭了喷涂中的错误

时间:2015-04-01 17:39:20

标签: 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

错误明细

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

我能够在所有这些版本中重现错误

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

1 个答案:

答案 0 :(得分:0)

如你所说,

  

为了确保这不是API的服务器问题,我复制了相同的内容   使用Node.js(Express和Request libs)进行查询,它可以运行   时间。这让我几乎可以肯定是一个喷雾虫。

scala中的代码使用HTTP流水线功能发送请求,在使用nodejs进行测试时,是否使用HTTP流水线功能发送请求?

表示错误消息:

  

服务器似乎不支持请求流水线

你应该确定:

  1. 请确保服务器支持流水线功能,并启用流水线功能。
  2. 如果客户端和服务器之间存在代理(包括反向代理),请确保代理支持流水线功能,并启用流水线功能。
  3. 如果无法确保正确支持流水线功能,则不应使用它。

    以下资源可能会有所帮助:

      

    HTTP流水线操作需要客户端和服务器都支持它。   需要符合HTTP / 1.1标准的服务器来支持流水线操作。这个   并不意味着服务器需要管道响应,但是   如果客户选择管道,则要求它们不会失败   请求。[7]

    https://en.wikipedia.org/wiki/HTTP_pipelining

      

    现代浏览器默认情况下不会激活HTTP流水线操作:

         

    越野车代理仍然很常见,这些导致奇怪和不稳定   Web开发人员无法轻易预见和诊断的行为。   流水线操作很难正确实现:资源的大小   被转移,将使用的有效RTT,以及   有效带宽,对改进有直接影响   由管道提供。不知道这些重要信息   可能会推迟到不重要的人身后。甚至重要的概念   在页面布局期间进化! HTTP流水线因此带来了   仅在大多数情况下略有改善。流水线操作受制于   HOL问题。由于这些原因,流水线已被a取代   更好的算法,多路复用,HTTP / 2使用。

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x $修订/ 1330814