2017-03-14 5 views
0

私は支援が必要です。SpringブロッキングとJavaで非ブロッキングREST 8

私のエンドポイントの1つにタイムアウトが発生したことが、私に苦痛を与えています。 私は使用しているSQLや他のRESTサービスを使用してパフォーマンスを調整しましたが、少し役に立ちます。 この問題を解決するには、Spring BootとJava 8の非同期機能のいくつかを使用し、何らかの「Fire and forget」アクションを実行することです。

私はそのようなことを試みましたが、それは良いことではありません、 "ロックする時間!"メッセージは正常に印刷されますが、getLyrics()メソッドは呼び出されません。

//MyController.java 
    @GET 
    @Path("na/na/na") 
    @Produces({"application/json"}) 
    public Response getLyrics() { 

     final String lyrics = delegate.getLyrics(); 
     return Response.ok().entity(lyrics.isEmpty()).build(); 
    } 

    //MyDelegate.java 
    @Async("threadPoolTaskExecutor") 
    public Future<Boolean> getLyrics() { 

     LOG.info("Time to rock!"); 
     final boolean result = lyricsService.getLyrics(); 
     return new AsyncResult<Boolean>(result); 
    } 

    //MyAsyncConfig.java 
    @Configuration 
    @EnableAsync 
    public class MyAsyncConfig { 

     @Bean(name = "threadPoolTaskExecutor") 
     public Executor threadPoolTaskExecutor() { 
      return new ThreadPoolTaskExecutor(); 
     } 
    } 

ので、lyricsService.getLyricsは()(それが何らかの理由で呼び出されていない)、他のサービスを呼び出すSQLデータベースからのものを取得し、他のいくつかのRESTエンドポイントに対する呼び出しを実行し、すべての作業を行います。これには時間がかかり、時にはタイムアウトが発生することもあります。私はそれを平和の中で処理したいと考えており、可能であれば可能な限り何らかの応答を返します。

私はこのソリューションのいくつかのバリエーションを試してみましたが、必要なものに近いと思われますが、なぜ私にとってはうまくいかないのか分からないようです。

*しばしば

+0

知らせます私は残りのコントローラからCompletableFutureを返した後、SpringブートはI/O非ブロック化を使用しますか? – Matrix12

答えて

0

私が思うに、春先物は操作が完了するまで待たなければなりません。しかし、Javaの完成可能な未来は、おそらくあなたがそれを試すことができますより強力です。

Future<String> a = ...; 

while(!a.isDone()){ 
} 

ここはサンプルです。 https://spring.io/guides/gs/async-method/

0

あなたのコントローラ非ブロックを作るためにJava8の計算可能な未来と一緒に、SpringのDefferedResultを使用し、それによってComupatable今後のwhenAsync method.Here内部長時間実行taksを委任することができるが、実施例である - https://github.com/kazi-imran/TransactionStatistics

関連する問題