[英]Use ExecutorCompletionService to perform concurrent calls to different dependencies
我正在嘗試使用ExecutorCompletionService- https: //docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorCompletionService.html嘗試對兩個不同的依賴程序包執行並發調用。
我使用ExecutorCompletionService的原因是因為我想比較兩個依賴項返回的結果,然后根據特定要求發出指標。
我的代碼如下所示:
@Builder
@Slf4j
public class TestClass {
@NonNull private final ExecutorService threadPool = Executors.newFixedThreadPool(2);
@NonNull private final ExecutorCompletionService<ResultStructure1> dependency1Thread = new ExecutorCompletionService<>(threadPool);
@NonNull private final ExecutorCompletionService<ResultStructure2> dependency2Thread = new ExecutorCompletionService<>(threadPool);
public void myMethod() {
RequestObject1 firstDependencyRequest = RequestObject1.builder()
.attribute1("someValue")
.attribute2("secondValue");
RequestObject2 secondDepdencyRequest = RequestObject1.builder()
.attribute1("depdency2Value")
.attribute2("depdency2Secondvalue");
dependency1Thread.submit(() -> dependency1Client1.call(firstDependencyRequest));
dependency2Thread.submit(() -> dependencyClient2.call(secondDepdencyRequest));
final Future<ResultStructure1> future1 = dependency1Thread.take();
final Future<ResultStructure2> future2 = dependency2Thread.take();
try {
ResultStructure1 = future1.get();
ResultStructure2 = future2.get();
} catch (ExecutionException e) {
log.error("Exception calling dependency", e);
throw e;
}
}
}
這是對不同的依賴項使用ExecutorCompletionService的正確方法嗎? 有沒有辦法擁有一個executorService並從中調用兩個依賴項?
這是對不同的依賴項使用ExecutorCompletionService的正確方法嗎?
抱歉不行。 您通常會用它來執行返回相似類型結果的任務,同時等待其執行結果可用。 在內部,它使用BlockingQueue
在完成任務時在其中添加Future
,然后由其blocking take
方法返回。
因此,如果您確實想使用ExecutorCompletionService
,則必須為ResultStructure1
和ResultStructure2
(即ResultStructure
)提供一個基本/通用類型,並聲明如下的完成服務-
private final ExecutorCompletionService<ResultStructure> completionService =
new ExecutorCompletionService<>(threadPool)
接着 -
completionService.submit(() -> dependency1Client1.call(firstDependencyRequest));
completionService.submit(() -> dependencyClient2.call(secondDepdencyRequest));
然后,您可以使用“阻止take
方法等待其結果可用-
Future<ResultStructure> result1 = completionService.take();
Future<ResultStructure> result2 = completionService.take();
請注意,目前,我們無法找出哪種Future
代表哪種具體結果類型。 因此,您無法比較結果。
我的建議是直接使用ExecutorService。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.