バタバタしているので後で見返せるようにザクッとメモ
ポイント
- デフォルトでは@Asyncによる非同期処理が機能しないので@EnableAsyncをつける
- @Service内のメソッドやクラス単位で@Asyncを付与。これだけでその部分を非同期処理にすることができる。
- ExecutorをリターンするgetAsyncExecutorメソッドをオーバーライドすることで設定が書ける
@Async // コメントアウトすると、メインスレッドで実行されるようになります。非同期処理はなされなくなりますが、コンパイルエラーにはなりません。
public Future<User> findUser(String user) throws InterruptedException {
logger.info("Looking up " + user);
String url = String.format("https://api.github.com/users/%s", user);
User results = restTemplate.getForObject(url, User.class);
// 非同期処理を並列実行することによって、処理時間が短縮されることを分かりやすくするための sleep です。
Thread.sleep(1000L);
return new AsyncResult<>(results);
}
関係ないけど参考記事のこの部分を見て、未だ利用したことのないRestTemplateに俄然興味を持った。
機会があればいじってみたい。ストックとして面白そうな記事を載せておく。
参考記事
Spring Boot における非同期処理
Springの@Asyncで非同期処理をする
Springbootで非同期処理はとっても簡単
Javaの並列化コードサンプル集(MPSDやMPMDの並列化あたりはThread、Runnableの参考にできる)
さあ、並列プログラミングをはじめよう(ExecutorはThreadの上位互換っぽい)
非同期処理にはThreadを直接使わずにExecutorServiceを使用する