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

Vertx WebClient响应缓慢

莫欣悦
2023-03-14

我不熟悉vertx和RxJava。我正在尝试实现一个简单的测试程序。然而,我无法理解这个项目的动态。为什么有些请求需要10秒钟以上才能响应?

下面是我的示例测试应用程序

public class Test {

public static void main(String[] args) {

Vertx vertx = Vertx.vertx();
WebClient webClient = WebClient.create(vertx);

Observable < Object > google = hitURL("www.google.com", webClient);
Observable < Object > yahoo = hitURL("www.yahoo.com", webClient);

for (int i = 0; i < 100; i++) {
  google.repeat(100).subscribe(timeTaken -> {
    if ((Long) timeTaken > 10000) {
      System.out.println(timeTaken);
    }
  }, error -> {
    System.out.println(error.getMessage());
  });
  yahoo.repeat(100).subscribe(timeTaken -> {
    if ((Long) timeTaken > 10000) {
      System.out.println(timeTaken);
    }
  }, error -> {
    System.out.println(error.getMessage());
  });
}
}

public static Observable < Object > hitURL(String url, WebClient webClient) {
return Observable.create(emitter -> {
  Long l1 = System.currentTimeMillis();
  webClient.get(80, url, "").send(ar -> {
    if (ar.succeeded()) {
      Long elapsedTime = (System.currentTimeMillis() - l1);
      emitter.onNext(elapsedTime);
    } else {
      emitter.onError(ar.cause());
    }
    emitter.onComplete();
  });
});
}
}

我想知道的是,是什么让我的响应时间变慢了?

共有1个答案

邓禄
2023-03-14

这里的问题似乎在于您使用WebClient的方式和/或您测量“响应”时间的方式(取决于您在这里试图实现的目标)。

垂直。与大多数http客户端一样,x的WebClient在后台使用大小有限的连接池来发送请求。换句话说,调用。发送(…) 不一定立即启动http请求-相反,它可能会在某种队列中等待可用的连接。您的测量包括此潜在等待时间。

您正在使用默认池大小,它似乎是5(至少在最新版本的Vert. x中-它在此处定义),并且几乎立即启动200个超文本传输协议请求。大多数时候您的请求都在等待可用连接,这并不奇怪。

如果要测试我是否正确,可以尝试增加池大小:

WebClient WebClient=WebClient。创建(vertx,new WebClientOptions()。setMaxPoolSize(…);

 类似资料:
  • 问题内容: 我想确保浏览器永远不会缓存服务器的响应,这样即使发出两个相同的请求(相隔一纳秒),也始终会与服务器联系。这是实现此目标的正确方法: 谢谢唐 问题答案: 不,那不是正确的方法。这是正确的方法: 您可能会看到其他人在建议其他条目/属性,但是当至少提及上述内容时,它们是完全不相关的。 更改后,请不要忘记在测试之前清除浏览器缓存。 也可以看看: 网站站长缓存教程

  • 问题内容: 我使用一些GeoIP服务在页面上放置国家/地区标记,具体取决于国家/地区IP。我需要为网站上的所有页面缓存JSON响应。 将此代码放入: 是否可以将其缓存?-似乎不起作用。 或者使用HTML5 localStorage可能更好,但是我不确定该怎么做。 我也尝试了JSONCache插件,但是对我来说不起作用。 问题答案: 您可以这样使用localStorage: 演示 因此,在您的特定情

  • 问题内容: 我正在使用以下代码从服务器提取简单的JSON提要: 有用。但是,在更改JSON文件并验证是否在浏览器中进行了更改之后,当我再次运行该应用程序时,仍会得到先前的响应。 看来AFNetworking正在某种程度上缓存旧的响应。我不要这种行为。我想下载当前的提要。是否需要某种类型的设置或参数来关闭缓存? 问题答案: 简而言之,只需定义您的AFNetworking经理即可: 请享用!

  • 我们正在Azure应用服务上运行WebJob和Api。一些WebJob执行对第三方服务(如ebay)的REST呼叫。所有这些都很好,直到几天前,服务开始随机抛出这个错误: 调用有时工作,但非常慢,有时会返回错误。运行服务的本地实例不会导致失败。只有在正式生产环境中,我们才会遇到这些问题。 我们使用HttpClient的一个单例实例来执行调用。 我们这样使用客户端调用endpoint: GetMes

  • 问题内容: 我有以下代码对URL进行GET请求: 但是返回的结果并不总是能反映出来。例如,我对响应进行了更改,吐出了堆栈跟踪,但是当我单击搜索按钮时,堆栈跟踪没有出现。我查看了控制ajax响应的基础PHP代码,它具有正确的代码,直接访问页面显示了正确的结果,但.load返回的输出是旧的。 如果我关闭浏览器并重新打开它,它将运行一次,然后开始返回陈旧的信息。我可以通过jQuery控制它,还是需要PH

  • 我有从我的网页生成的AJAX POST请求,可能有多个POST请求具有相同的POST数据。但是响应可能会有所不同,我希望确保我没有得到这些请求的缓存响应。我需要每个请求点击网页。 我假设对POST请求的响应不会被缓存,这对吗?