私は支援が必要です。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エンドポイントに対する呼び出しを実行し、すべての作業を行います。これには時間がかかり、時にはタイムアウトが発生することもあります。私はそれを平和の中で処理したいと考えており、可能であれば可能な限り何らかの応答を返します。
私はこのソリューションのいくつかのバリエーションを試してみましたが、必要なものに近いと思われますが、なぜ私にとってはうまくいかないのか分からないようです。
*しばしば
知らせます私は残りのコントローラからCompletableFutureを返した後、SpringブートはI/O非ブロック化を使用しますか? – Matrix12