从Vert.x

时间:2018-06-09 20:39:20

标签: java asynchronous vert.x

我今天使用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。严重:路径中出现意外异常

java.lang.IllegalStateException:如果不使用HTTP分块编码,则必须将Content-Length标头设置为在发送任何数据之前消息体的总大小。

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 :(得分: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。