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
实例。
浪费资源,效率低下
我正在使用 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
实例。
浪费资源,效率低下