Vertx.io GET 静默失败

Vertx.io GET silently fails


我正在使用 vertx 编写 POC,在我们必须将 Spring Web 从 4.x 迁移到 5 以符合 java 9 时寻找替代方案。 我写了一个简单的客户端,只是为了让一些东西工作而向一个公共可用的服务器发送一个 GET,但它默默地让我失望了。

    public List<String> pull() {

      Vertx vertx = Vertx.vertx();

      HttpClientOptions options = new HttpClientOptions().setLogActivity(true);
      HttpClient hc = vertx.createHttpClient(options);
      hc.getNow(80, "http://sunet.se", "/",r -> {
        System.out.println("\n****** Handler called! ***\n");
      });
      return new ArrayList<>();
  }

这会默默地失败,我不明白为什么。 据我所知,我完全按照文档中给出的示例进行操作。 无奈之下,我启动了 wire shark,根据 WS,没有实际调用(当我使用浏览器 WS 捕获它时)。所以,我的电话似乎从未真正完成。我没有得到任何例外或任何东西。将日志级别设置为调试除了

之外没有什么值得注意的
Failed to get SOMAXCONN from sysctl and file /proc/sys/net/core/somaxconn. Default: 128

这不应该使调用失败。 我也尝试过使用 vertx.io WebClient 但同样失败了。
更新
我已经设法让它工作,但有一个警告。
正如@tsegismont 在他的回答中指出的那样,URI 的协议部分不应该存在,示例中没有,我只是自己错过了它。
我 运行 我的示例作为独立的,然后它起作用了。
我最初的例子是 运行 作为 junit 测试(这是一种测试代码的简单方法,我通常会先尝试编写测试代码),当它作为 junit 测试 运行 时它仍然不起作用.为什么会这样,我不知道。如果有人能告诉我如何让它工作,我将不胜感激。

您使用的 getNow 变体需要服务器主机,而不是 URL。应该是:

hc.getNow(80, "sunet.se", "/",r -> {
  System.out.println("\n****** Handler called! ***\n");
}

如果您在 Vert.x 文档中发现了这样的片段,那就是一个错误。你介意举报吗?

现在提几点意见。

1/ HttpClient 是 low-level 客户。

大多数用户应该更喜欢 Vert.x Web Client

这是您的用例示例:

WebClient client = WebClient.create(vertx);

client
  .get(80, "sunet.se", "/")
  .send(ar -> {
    if (ar.succeeded()) {
      // Obtain response
      HttpResponse<Buffer> response = ar.result();
      System.out.println("Received response with status code" + response.statusCode());
    } else {
      System.out.println("Something went wrong " + ar.cause().getMessage());
    }
  });

2/ 创建单个 Vert.x 和 WebClient 实例

不要在每次方法调用时都创建 Vert.x 和 WebClient 实例。 浪费资源,效率低下