我今天使用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本身。
问题:
java.lang.IllegalStateException:如果不使用HTTP分块编码,则必须将Content-Length标头设置为在发送任何数据之前消息体的总大小。
这是我的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 {
}
}
答案 0 :(得分:2)
1 /使用客户端
IllegalStateException
消息解释了问题:如果您没有使用分块编码进行传输,则必须在发送数据之前设置有效负载的内容长度(根据Web标准的要求):
request.putHeader(HttpHeaders.CONTENT_LENGTH, contentSize);
或者,您可以简单地调用request.write(content)
,而不是request.end()
然后调用request.end(content)
。在这种情况下,Vert.x将为您计算内容长度标题。
请注意,Vert.x团队不建议使用低级HttpClient
。这适用于高级用例。看看WebClient
,它更容易处理:vertx-web-client
2 /并行处理
有不同的解决方案来组合并行处理的请求的结果。内置解决方案是使用Vert.x Future
代替回调来进行WebClient调用,然后使用concurrent composition:
CompositeFuture.all(Arrays.asList(future1, future2, future3));
否则你可以试试RxJava。