使用JDK8流和CompletableFuture调用WebService和REST API

问题描述 投票:0回答:1

我需要进行SOAP调用,然后在REST调用中处理SOAP调用的结果。每组呼叫均基于一批记录。我完全迷失在试图使其尽可能使用异步JDK8流中运行。我该怎么做?

SOAP Call:

CompletableFuture<Stream<Product>> getProducts(final Set<String> criteria)
{
    return supplyAsync(() -> {
        ...
        return service.findProducts(request);
    }, EXECUTOR_THREAD_POOL);
}

REST呼叫:

final CompletableFuture<Stream<Result>> validateProducts(final Stream<Product> products)
{
    return supplyAsync(() -> service
        .submitProducts(products, false)
        .stream(), EXECUTOR_THREAD_POOL);
}

我正在尝试调用SOAP调用,将结果传递给REST调用,并使用JDK8流收集结果。每个SOAP-> REST调用都是类似于分页的记录(或批处理)的“集合”。 (这现在完全不起作用,只是一个例子。)>

@Test
public void should_execute_validations()
{
    final Set<String> samples = generateSamples();

    //Prepare paging...
    final int total = samples.size();
    final int pages = getPages(total);
    log.debug("Items: {} / Pages: {}", total, pages);

    final Stopwatch stopwatch = createStarted();
    final Set<Result> results = range(0, pages)
        .mapToObj(index -> {
            final Set<String> subset = subset(index, samples);
            return getProducts(subset)
                .thenApply(this::validateProducts);
        })
        .flatMap(CompletableFuture::join)
        .collect(toSet());
    log.debug("Executed {} calls in {}", pages, stopwatch.stop());
    assertThat(results, notNullValue());
}

我需要进行SOAP调用,然后在REST调用中处理SOAP调用的结果。每组呼叫均基于一批记录。我完全迷失在试图得到...

java soap java-stream completable-future
1个回答
0
投票

我认为您的示例中有两种用法是不正确的:thenApplyjoin

© www.soinside.com 2019 - 2024. All rights reserved.