Сегодня я использую контроллеры 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 {
}
}