2017-10-04 39 views
0

如果您願意,我需要一些建議。我需要從我的spring應用程序並行調用幾個異步服務。我的意思是:代碼應該和最慢的異步任務一樣慢在Spring中實現異步服務並行處理的最佳方式

我已經用以下方式對它進行了編碼,但我不太確定這是否是最好的方法。可能不是xD。實際上,我並不習慣java8 lambdas和流媒體,所以我可能是一個改進點。

```

@Service 
@Qualifier("service1") 
public class Service1 implements IService { 
    @Async("processExecutor") 
    public AsyncResult<MyResult> doStuff(Stuff input){  
     return new AsyncResult<Optional<MyResult>>(callStuff(input)); 
    } 
} 

@Service 
@Qualifier("service2") 
public class Service2 implements IService { 
    @Async("processExecutor") 
    public AsyncResult<MyResult> doStuff(Stuff input){  
     return new AsyncResult<Optional<MyResult>>(callStuff(input)); 
    } 
} 

@Service 
@Qualifier("service3") 
public class Service3 implements IService { 
    @Async("processExecutor") 
    public AsyncResult<MyResult> doStuff(Stuff input){  
     return new AsyncResult<Optional<MyResult>>(callStuff(input)); 
    } 
} 

,然後在另一個春天的服務,我有以下的東西:

```

AsyncResult<MyResult>aResult1=service1.doStuff(input); 
AsyncResult<MyResult>aResult2=service2.doStuff(input); 
AsyncResult<MyResult>aResult3=service3.doStuff(input); 

MyResult result1= aResult1.get(); 
MyResult result2= aResult2.get(); 
MyResult result2= aResult3.get(); 

你點我在正確的方向,如果你能夠?

非常感謝!

回答

1

您可能需要使用CompletableFuture.allOf

CompletableFuture<MyResult> futur1=CompletableFuture.supplyAsync(()->{return service1.doStuff(input);}); 
CompletableFuture<MyResult> futur2=CompletableFuture.supplyAsync(()->{return service2.doStuff(input);}); 
CompletableFuture<MyResult> futur3=CompletableFuture.supplyAsync(()->{return service3.doStuff(input);}); 

CompletableFuture<Void> allCompleted = CompletableFuture.allOf(futur1,futur2,futur3); 
allCompleted.get();// this one will block current thread until futur1,futur2,futur3 done. 

MyResult r1 = futur1.get(); 
MyResult r2 = futur2.get(); 
MyResult r3 = futur3.get(); 
  • 你需要首先從服務中刪除所有@Async。
  • 不需要使用AsyncResult來包裝MyResult
+0

謝謝@chenjun!我會試試看! – Bringer

相關問題