Java 并发性:需要同时进行 2 个 Web 服务调用 - 这是否正确?
Java Concurrency: Need to make 2 webservice calls simultaneously - is this correct?
我想同时对 2 个不同的服务进行网络调用。最后,我将 2 Response
个对象压缩到一个流中。我正在使用 Callable
,但我不确定我是否以正确的方式处理此问题。好像我仍然会被第一个 get()
调用 Future
阻塞,对吧?有人可以告诉我我是否在正确的轨道上吗?这是我目前所拥有的:
// submit the 2 calls to the thread pool
ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
Future<Mono<Response<ProcessInstance>>> processFuture =
executorService.submit(() -> getProcessInstances(processDefinitionKey, encryptedIacToken));
Future<Mono<Response<Task>>> taskFuture =
executorService.submit(() -> getTaskResponses(processDefinitionKey, encryptedIacToken, 100, 0));
// get the result of the 2 calls
Optional<Tuple2<Response<ProcessInstance>, Response<Task>>> tuple;
try {
Mono<Response<ProcessInstance>> processInstances = processFuture.get();
Mono<Response<Task>> userTasks = taskFuture.get();
tuple = processInstances.zipWith(userTasks).blockOptional();
} catch (InterruptedException e) {
log.error("Exception while processing response", e);
// Restore interrupted state...
Thread.currentThread().interrupt();
return emptyProcessResponseList;
} catch (ExecutionException e) {
log.error("Exception while processing response", e);
return emptyProcessResponseList;
}
您的代码将阻塞直到 processFuture
完成,然后它将阻塞直到 taskFuture
完成。
可调用对象将并行处理,因此您可以节省时间(假设线程池大小 >= 2)。
鉴于:您需要等到两个任务都完成。
如果processFuture
先结束,您将立即掉线并等待taskFuture
结束。如果 taskFuture
先结束,您将阻塞直到 processFuture
结束,但是 taskFuture.get()
调用将立即 return 因为该任务已完成。无论哪种情况,结果都是一样的。
您 可以 改用 CompletableFuture
,然后 CompletableFuture.allOf()
但是对于这么简单的事情,您已经可以正常工作了。另见 Waiting on a list of Future
我想同时对 2 个不同的服务进行网络调用。最后,我将 2 Response
个对象压缩到一个流中。我正在使用 Callable
,但我不确定我是否以正确的方式处理此问题。好像我仍然会被第一个 get()
调用 Future
阻塞,对吧?有人可以告诉我我是否在正确的轨道上吗?这是我目前所拥有的:
// submit the 2 calls to the thread pool
ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
Future<Mono<Response<ProcessInstance>>> processFuture =
executorService.submit(() -> getProcessInstances(processDefinitionKey, encryptedIacToken));
Future<Mono<Response<Task>>> taskFuture =
executorService.submit(() -> getTaskResponses(processDefinitionKey, encryptedIacToken, 100, 0));
// get the result of the 2 calls
Optional<Tuple2<Response<ProcessInstance>, Response<Task>>> tuple;
try {
Mono<Response<ProcessInstance>> processInstances = processFuture.get();
Mono<Response<Task>> userTasks = taskFuture.get();
tuple = processInstances.zipWith(userTasks).blockOptional();
} catch (InterruptedException e) {
log.error("Exception while processing response", e);
// Restore interrupted state...
Thread.currentThread().interrupt();
return emptyProcessResponseList;
} catch (ExecutionException e) {
log.error("Exception while processing response", e);
return emptyProcessResponseList;
}
您的代码将阻塞直到 processFuture
完成,然后它将阻塞直到 taskFuture
完成。
可调用对象将并行处理,因此您可以节省时间(假设线程池大小 >= 2)。
鉴于:您需要等到两个任务都完成。
如果processFuture
先结束,您将立即掉线并等待taskFuture
结束。如果 taskFuture
先结束,您将阻塞直到 processFuture
结束,但是 taskFuture.get()
调用将立即 return 因为该任务已完成。无论哪种情况,结果都是一样的。
您 可以 改用 CompletableFuture
,然后 CompletableFuture.allOf()
但是对于这么简单的事情,您已经可以正常工作了。另见 Waiting on a list of Future