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と同じ。