从数据库中提取数据时如何与“未来”同步

时间:2019-05-23 15:57:27

标签: java asynchronous future iasyncresult

有一个异步构造。从这里的数据库中读取后,我想继续处理。我尝试如下使用“ while”循环,但没有使用。无休止的循环。如果没有“ while”循环,则该循环是异步的,但对我不起作用。

private XmlOperations fetchAttributeFromDB(RequestContext context, 
                   XmlOperations invCnclAttributes,String orderId) {

    String strSQL = "select bankStan,bankBatch,provBank from transactionHistory where orderId='"+orderId+"' limit 1";
    DBClientService dbClientService = DBClientService.getService(context);
    try {
        Future<List<JsonArray>> futureHistory = dbClientService.ExecuteQuery(strSQL);
        futureHistory.setHandler(sqlResult -> {
            List<JsonArray> result = futureHistory.result();
            invCnclAttributes.addAttribute("bankStan", result.get(0).getString(0));
            invCnclAttributes.addAttribute("bankBatch", result.get(0).getString(1));
            invCnclAttributes.addAttribute("provBank", result.get(0).getString(2));
            futureHistory.complete();
        });
        while(!futureHistory.isComplete());
    }catch(Exception e){
        e.printStackTrace();
    }
    return invCnclAttributes;
}

1 个答案:

答案 0 :(得分:0)

您没有说是否可以使用Java 8(支持CompletableFuture和Streams)或Java 9(也支持“反应式” Flow API)。

假设您可以使用Java 8,并且对Futures感到相当满意。

然后您要使用CompletableFuture。而且,正如Thilo所指出的,您肯定要使用thenApplythenCompose来组成您的列表。

情况下,如果您完全可以避免的话,是否要使用“轮询循环”。

这是一个很棒的简短教程,它将告诉您基本概念,并提供示例代码:

Baeldung: Guide To CompletableFuture

这是我个人发现的一本书,对于理解新的Java并发API很有帮助:

Modern Java in Action: Lambdas, streams, functional and reactive programming 2nd Edition

<=第二版也涵盖了Java 9和Java 10