S-JIS[2024-03-11] 変更履歴
ManagedExecutorServiceクラスのメモ。
(JAX-RSで)別スレッドで処理を実行したい場合はManagedExecutorServiceを使う。
ManagedExecutorServiceを使うには、build.gradleのdependenciesに以下のライブラリーを指定する。
dependencies {
compileOnly 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0'
compileOnly 'jakarta.enterprise.concurrent:jakarta.enterprise.concurrent-api:3.0.3'
}
ちなみに、仮想スレッドに対応するのはJakarta EE 11かららしい?
import java.util.concurrent.ExecutionException; import jakarta.annotation.Resource; import jakarta.enterprise.concurrent.ManagedExecutorService;
@Path("/resource1")
public class Resource1 {
@Resource
private ManagedExecutorService executorService;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() throws InterruptedException, ExecutionException {
var future = executorService.submit(() -> {
return ZonedDateTime.now();
});
var now = future.get();
return "hello " + now;
}
}
ManagedExecutorServiceは@Resourceでインジェクトする。
(ManagedExecutorServiceのインスタンスはJNDIで管理されており、JNDIからlookupする場合は@Resourceを使うようだ)
(@Injectは不可。APサーバーによってはデプロイに失敗したり、フィールドがnullになったりする)
ManagedExecutorServiceはExecutorServiceを継承しているので、使い方はExecutorServiceと同じ。