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 экземпляр на каждый вызов метода. Это тратит ресурсы и неэффективно.

Другие вопросы по тегам