当前位置: 首页 > 知识库问答 >
问题:

喷雾http客户端和数千个请求

勾海超
2023-03-14
akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://smallTasks/user/IO-HTTP#151444590]] after [15000 ms]
akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://smallTasks/user/IO-HTTP#151444590]] after [15000 ms]
akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://smallTasks/user/IO-HTTP#151444590]] after [15000 ms]
akka.pattern.AskTimeoutException: Ask timed out on 
  implicit val system = ActorSystem("smallTasks")
  implicit val timeout = new Timeout(15.seconds)

  import system.dispatcher

  def doHttpRequest(url: String): Future[HttpResponse] = {
    (IO(Http) ? HttpRequest(GET, Uri(url))).mapTo[HttpResponse]
  }
def getOnlineOffers(modelId: Int, count: Int = 0): Future[Any] = {

    val result = Promise[Any]()

    AkkaSys.doHttpRequest(Market.modelOffersUrl(modelId)).map(response => {
      val responseCode = response.status.intValue
      if (List(400, 404).contains(responseCode)) {
        result.success("Bad request")
      } else if (responseCode == 200) {
        Try {
          Json.parse(response.entity.asString).asOpt[JsObject]
        } match {
          case Success(Some(obj)) =>
            Try {
              (obj \\ "onlineOffers").head.as[Int]
            } match {
              case Success(offers) => result.success(offers)
              case _ => result.success("Can't find property")
            }

          case _ => result.success("Wrong body")
        }
      } else {
        result.success("Unexpected error")
      }
    }).recover { case err =>
      if (count > 5) {
        result.success("Too many tries")
      } else {
        println(err.toString)
        Thread.sleep(200)
        getOnlineOffers(modelId, count + 1).map(r => result.success(r))
      }
    }

    result.future

  }

如何恰当地做到这一点?也许我需要配置akka调度程序?

共有1个答案

殳经略
2023-03-14

您可以使用http://spray.io/documentation/1.2.2/spray-client/并为您编写个人管道

val pipeline: Future[SendReceive] =
      for (
        Http.HostConnectorInfo(connector, _) <-
          IO(Http) ? Http.HostConnectorSetup("www.spray.io", port = 80)
      ) yield sendReceive(connector)

    val request = Get("/segment1/segment2/...")
    val responseFuture: Future[HttpResponse] = pipeline.flatMap(_(request))

获取HttpResponse

import scala.concurrent.Await
import scala.concurrent.duration._
val response: HttpResponse = Aweit(responseFuture, ...)

转换

import spray.json._
response.entity.asString.parseJson.convertTo[T]
Try(response.entity.asString.parseJson).isSuccess
 类似资料:
  • 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的。您可以查看 HTTP 协议 了解更多相关信息。 以下是来自于浏览器端的重要头信息,您可以在 Web 编程中频繁使用: 头信息 描述 Accept 这个头信息指定浏览器或其他客户端可以处理的 MIME 类型。值 image/png 或 image/jpeg 是最常

  • 我使用Netty 4创建了一个相当直接的服务器。我已经能够将它扩展到处理数千个连接,而且它从未超过40个线程。 为了测试它,我还创建了一个创建数千个连接的测试客户端。不幸的是,这会创建和连接一样多的线程。我希望尽量减少客户端的线程。我已经看了很多帖子。许多示例显示了单个连接设置。这个和这个说在客户端之间共享NioEventLoopGroup,我这样做了。我得到的nioEventLoopGroup数

  • 问题内容: 关于POODLE漏洞,如果我理解正确,则它要求客户端在无法使用服务器发布的更高版本协议与服务器建立安全通道时,会自动将TLS协议降级为SSLv3。 当无法与服务器建立TLS会话时,常见的Java HTTP客户端库,特别是javax.net.ssl.HttpsURLConnection和Apache HttpClient是否会自动降级TLS协议?如果不是,我是否可以纠正它们不受POODL

  • 不确定这里遗漏了什么,但console.log()行打印的是“promise{}”,而不是响应中的JSON正文。 我认为我在async/await中做错了什么。 我的代码(快速): 感谢任何帮助。

  • 问题 你想创建一个 HTTP 客户端。 解决方案 在这个方法中,我们将使用 node.js's HTTP 库。我们将从一个简单的客户端 GET 请求示例返回计算机的外部 IP 。 关于 GET http = require 'http' http.get { host: 'www.google.com' }, (res) -> console.log res.statusCode get

  • HTTP客户端用于抓取网页HTML源码。 用法 自定义HTTP Header 获取抓取到的HTML 捕获HTTP异常 获取HTTP响应头等信息 自定义HTTP客户端 QueuryList推荐使用GuzzleHttp来作为HTTP客户端,它功能强大、使用简单、支持异步和并发请求,GuzzleHttp使用文档:http://guzzle-cn.readthedocs.io/zh_CN/latest/