Вызов нескольких исходящих звонков из Vert.x - PullRequest
0 голосов
/ 09 июня 2018

Сегодня я использую контроллеры Spring MVC для конечных клиентов, чтобы вызывать и обрабатывать исходящие сетевые вызовы.Сегодня все операции выполняются последовательно, и требование № 2 может выполняться только после # 1, но отдельные вызовы № 2 могут выполняться параллельно.

@RequestMapping(value = "/callme", method = RequestMethod.POST)
public MyResponse processMe(@RequestBody MyRequest myrequest, HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException {
    //do some computation

    // call end point 1 -------> #1

    //do some more computation

    for(int i = 0; i< n; i++) {
        // call end point 2 with different body ------->#2
    }

    //process request

    //set http response status code

    //return MyResponse

}

Чтобы решить эту проблему, всегда избегайте основного потокаожидание, Vertx.io кажется положительным направлением, однако я застрял в реализации самого # 1.

Проблемы:

1.SEVERE: непредвиденное исключение в маршруте

java.lang.IllegalStateException: необходимо установить заголовок Content-Length равным общему размеру тела сообщения ДО отправки любых данных, если вы не используете чанкованное кодирование HTTP.

2.Как реализовать вызов нескольких вызовов # 2 как часть обратного вызова?

Вот мой код Vert.x

private void callMe(RoutingContext routingContext) {
    final MyObj MyObj = Json.decodeValue(routingContext.getBodyAsString(),
        MyObj.class);


    HttpClient client = vertx.createHttpClient(options);


    HttpClientRequest request = client.post("<URL>" + MyObj.getCustomerId(), response -> {
        callback(response);

    }) ;

    // Now do stuff with the request


    request.putHeader(HttpHeaders.CONTENT_TYPE, "application/json");
    request.putHeader(HttpHeaders.ACCEPT, "application/json");
    request.write(routingContext.getBodyAsString());

    // Make sure the request is ended when you're done with it
    request.end();



    routingContext.response()
        .setStatusCode(200)
        .putHeader("content-type", "application/json; charset=utf-8")
        .end(Json.encodePrettily(uploadUrl));

}

private void callback(HttpClientResponse response) {
    System.out.println("received response: " + response.statusMessage());

    int code = response.statusCode();
    if (code == 200) {

    } else {

    }
}

1 Ответ

0 голосов
/ 11 июня 2018

1 / Использование клиента

Сообщение IllegalStateException объясняет проблему: если вы не используете chunked-кодировку для передачи, вы должны установить длину содержимого полезной нагрузки перед отправкой данных (как того требуетвеб-стандарты):

request.putHeader(HttpHeaders.CONTENT_LENGTH, contentSize);

Или вместо того, чтобы вызывать request.write(content), а затем request.end(), вы можете просто вызвать request.end(content).В этом случае Vert.x вычислит для вас заголовок длины содержимого.

Обратите внимание, что команда Vert.x не рекомендует использовать низкоуровневый HttpClient.Это для продвинутых случаев использования.Взгляните на WebClient, с которым гораздо проще иметь дело: vertx-web-клиент

2 / Параллельная обработка

Существуют различные решения для объединения результатовиз запросов, обрабатываемых параллельно.Встроенное решение заключается в использовании Vert.x Future вместо обратных вызовов для вызовов WebClient, а затем одновременной композиции :

CompositeFuture.all(Arrays.asList(future1, future2, future3));

В противном случае вы можете попробовать RxJava.

...