簡體   English   中英

使用ExecutorCompletionService對不同的依賴項執行並發調用

[英]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 ,則必須為ResultStructure1ResultStructure2 (即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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM