如何使用 RestEasy 进行批量(并发)PUT 调用?

How to make batch (concurrently) PUT calls using RestEasy?

我正在尝试向服务器发出多个 PUT 请求,并且每个请求都是独立的。最后,所有响应状态代码都是 &&ed 并且函数 returns 是 success/failure 上的布尔值。但是,在这种方法中,我必须等待每个响应,这会根据放置请求的数量增加延迟。

我想知道是否可以同时进行,从而无论调用次数如何,延迟都等于最长的调用。 (假设服务器可以同时处理所有这些)。 而不是编写自己的包装器,想知道是否 RestEasy 已经提供了一些东西。

我正在使用 RestEasy,目前我是这样做的:

public boolean makePuts(Entity[] entities) {
    boolean success = true;
    for (Entity entity : entities) {
        Response response = //Make put call using RestEasy.
        success = success && putContentAccepted(response);
    }
    return success;
}

private boolean putContentAccepted(final Response response) {
        return response != null &&
           ((response.getStatus() == Response.Status.NO_CONTENT.getStatusCode()) ||
           (response.getStatus() == Response.Status.CREATED.getStatusCode()) ||
           (response.getStatus() == Response.Status.OK.getStatusCode()));
    }

PS: 函数是打出来的,还没有编译,语法错误还请见谅。该功能揭示了我目前正在做的事情。

谢谢!

哈尔沙 P

我使用异步和 CountDownLatch 完成了这项工作。如果有更好的方法,请告诉我。

final List<Future<Response>> futureList = new ArrayList<>();
final List<> responseList = new ArrayList<Response>();
final CountDownLatch latch = new CountDownLatch(requestModels.size());
for (URI uri : uriList) {
    WebTarget target;
    //Use an input model object if there is need for entity, I am assuming just a list of URI. 
    //Rather take it as an object which has URI, Entity.
    futureList.add(target.request().async().put(null, new InvocationCallback<Response>() {
        @Override
        public void completed(Response response) {
            responseList.add(response);
        }

        @Override
        public void failed(Throwable throwable) {
            //handle error
        }
     }));
}
try {
    latch.await();
    return responseList;
    } catch (InterruptedException e) {
        //handle it
    }