2015-10-19 66 views
0

我有一個小的Spring Boot應用程序正在等待REST調用來啓動異步作業。但是,接下來我要做的是獲取這些異步作業的結果並將它們存儲在數據庫中。但我不知道如何以異步方式使用Future返回的對象。 這裏或多或少我有:如何檢索@Async方法的結果

@RequestMapping("/vlan/{id}/{name}") 
public void performVLANConfig(@PathVariable("id") int id, @PathVariable("name") String name) { 
    logger.debug("Received req"); 
    Future<ProcessedRequest> processedRequestFuture= asyncService.processVlan(id, name); 

    processedRequestRepository.save(processedRequest); 
} 

但現在只是等待異步調用結束。有沒有什麼辦法讓異步方法過完生命,並且在完成之後存儲這個完成錯誤?

+1

使用CompletableFuture與Java 8或ListenableFuture與早期版本 –

+0

@SeanPatrickFloyd您可以使服務返回completablefuture?或者你需要通過自己調用f.complete(result)來設置結果?只是好奇。 –

+0

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.2.html#_web_improvements_2 –

回答

1

您需要附加回調。如果您使用Future,那麼您無法附加回撥,只能分配給ListenableFuture,當然服務需要返回ListenableFuture

ListenableFuture<ProcessedRequest> future = asyncService.processVlan(id, name); 

future.addCallback(new ListenableFutureCallback<ProcessedRequest>() { 
     @Override 
     public void onFailure(Throwable throwable) { 
      // deal with it 
     } 
     @Override 
     public void onSuccess(ProcessedRequest processedRequest) { 
      processedRequestRepository.save(processedRequest); 
     } 
    }); 
+0

謝謝,那正是我所需要的。 –