2017-10-04 15 views
0

私はいくつかのアドバイスが必要です。私は春のアプリケーションから、いくつかの非同期サービスを並行して呼び出す必要があります。つまり、コードは最も遅い非同期タスクと同じくらい遅くなければなりません。Springで非同期サービスの並列処理を実装する最良の方法

私は以下の方法でコード化しましたが、これが最良の方法であるかどうかはわかりません。おそらくxDではありません。実際、私はjava8のlambdaとストリームのものに慣れていないので、私は改善のポイントになる可能性があります。

`` `

@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

あなたは、あなたが最初にあなたのサービスからすべての@Asyncを削除する必要がある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(); 
  • を使用することもできます。
  • MyResult
+0

おかげで@chenjunラップするAsyncResultを使用する必要はありません!私は試してみるつもりだ! – Bringer

関連する問題