我正在使用vertx编写POC,当我们必须将Spring Web从4.x迁移到5以符合java 9时,寻找替代方案。
我写了一个简单的客户端,只是为了让一些工作正常而服务于一个公共服务器,但它却默默地让我失望。
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<>();
}
这将无声地失败,我无法理解为什么。 据我所知,我完全按照文档中给出的示例进行操作。 无奈之下,我开火线鲨,根据WS,没有实际的呼叫(当我使用浏览器WS捕获时)。所以,似乎我的电话从未真正完成。我没有任何例外或任何事情。将日志级别设置为debug除了
之外没有任何值得注意的事项Failed to get SOMAXCONN from sysctl and file /proc/sys/net/core/somaxconn. Default: 128
这不应该使电话失败。
我也尝试过使用vertx.io WebClient,但也是以同样的方式失败了。
的更新
我已经设法让它工作,但有一个警告
正如@tsegismont在他的回答中所述,URI的协议部分不应该存在,那不在示例中,我只是自己错过了。
我把我的例子作为一个独立的例子,然后它起作用了。
我的原始示例是作为junit测试运行的(这是测试代码的一种简单方法,我通常首先尝试编写测试代码),当它作为junit测试运行时,它仍然不起作用。为什么呢,我不知道。如果有人能告诉我如何让它发挥作用,我将不胜感激。
答案 0 :(得分:2)
您使用的getNow
变体需要服务器主机,而不是URL。它应该是:
hc.getNow(80, "sunet.se", "/",r -> {
System.out.println("\n****** Handler called! ***\n");
}
如果您在Vert.x文档中找到了这样的代码段,那就是一个错误。你介意报告吗?
现在发表一些意见。
1 / HttpClient
是一个低级客户端。
大多数用户应该更喜欢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
实例。
它浪费资源并且效率低下。