如何使用 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
}
我正在尝试向服务器发出多个 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
}