Vertx.io GET молча терпит неудачу
Я пишу POC с использованием vertx, ища альтернативы, когда нам нужно перенести 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 фиксирует это). Так что, похоже, мой звонок на самом деле никогда не заканчивается. Я не получаю никаких исключений или ничего. Установка уровня журнала для отладки не дает ничего заслуживающего внимания, кроме
Failed to get SOMAXCONN from sysctl and file /proc/sys/net/core/somaxconn. Default: 128
И это не должно подвести вызов. Я также пытался использовать vertx.io WebClient, но это также не удается, таким же образом.
ОБНОВИТЬ
Мне удалось заставить его работать, но с оговоркой.
Как @tsegismont заявляет в своем ответе, протокольной части URI не должно быть, чего не было в примерах, я просто пропустил это сам.
Я запустил свой пример в качестве отдельного приложения, и тогда это сработало.
Мой оригинальный пример был выполнен как тест junit (это простой способ тестирования кода, и я обычно сначала пытаюсь написать тестовый код), а когда он запускается как тест junit, он все еще не работает. Почему это я понятия не имею. Я был бы очень признателен, если бы кто-нибудь сказал мне, как заставить это работать.
1 ответ
getNow
Используемый вами вариант предполагает хост сервера, а не URL. Так должно быть:
hc.getNow(80, "sunet.se", "/",r -> {
System.out.println("\n****** Handler called! ***\n");
}
Если вы нашли такой фрагмент в документации Vert.x, это ошибка. Не могли бы вы сообщить об этом?
Теперь несколько комментариев.
1 / HttpClient
это клиент низкого уровня.
Большинство пользователей предпочитают веб-клиент Vert.x
Вот пример для вашего варианта использования:
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
экземпляр на каждый вызов метода. Это тратит ресурсы и неэффективно.