@@ -189,12 +189,12 @@ private static ThreadFactory virtualThreadFactory() {
189189 long maxWorkerExecuteTime = options .getMaxWorkerExecuteTime ();
190190
191191 ThreadFactory workerThreadFactory = createThreadFactory (threadFactory , checker , useDaemonThread , maxWorkerExecuteTime , maxWorkerExecuteTimeUnit , "vert.x-worker-thread-" , true );
192- ExecutorService workerExec = new WrappedWorkerExecutorService (
193- executorServiceFactory .createExecutor (workerThreadFactory , workerPoolSize , workerPoolSize ), true , this );
192+ ExecutorService workerExec = wrapWorkerExecutor (
193+ executorServiceFactory .createExecutor (workerThreadFactory , workerPoolSize , workerPoolSize ), executorServiceFactory );
194194 PoolMetrics workerPoolMetrics = metrics != null ? metrics .createPoolMetrics ("worker" , "vert.x-worker-thread" , options .getWorkerPoolSize ()) : null ;
195195 ThreadFactory internalWorkerThreadFactory = createThreadFactory (threadFactory , checker , useDaemonThread , maxWorkerExecuteTime , maxWorkerExecuteTimeUnit , "vert.x-internal-blocking-" , true );
196- ExecutorService internalWorkerExec = new WrappedWorkerExecutorService (
197- executorServiceFactory .createExecutor (internalWorkerThreadFactory , internalBlockingPoolSize , internalBlockingPoolSize ), true , this );
196+ ExecutorService internalWorkerExec = wrapWorkerExecutor (
197+ executorServiceFactory .createExecutor (internalWorkerThreadFactory , internalBlockingPoolSize , internalBlockingPoolSize ), executorServiceFactory );
198198 PoolMetrics internalBlockingPoolMetrics = metrics != null ? metrics .createPoolMetrics ("worker" , "vert.x-internal-blocking" , internalBlockingPoolSize ) : null ;
199199
200200 ThreadFactory virtualThreadFactory = virtualThreadFactory ();
@@ -1118,8 +1118,8 @@ private synchronized WorkerPool createSharedWorkerPool(CloseFuture closeFuture,
11181118 }
11191119 WorkerPool shared = createSharedResource ("__vertx.shared.workerPools" , name , closeFuture , cf -> {
11201120 ThreadFactory workerThreadFactory = createThreadFactory (threadFactory , checker , useDaemonThread , maxExecuteTime , maxExecuteTimeUnit , name + "-" , true );
1121- ExecutorService workerExec = new WrappedWorkerExecutorService (
1122- executorServiceFactory .createExecutor (workerThreadFactory , poolSize , poolSize ), true , VertxImpl . this );
1121+ ExecutorService workerExec = wrapWorkerExecutor (
1122+ executorServiceFactory .createExecutor (workerThreadFactory , poolSize , poolSize ), executorServiceFactory );
11231123 PoolMetrics workerMetrics = metrics != null ? metrics .createPoolMetrics ("worker" , name , poolSize ) : null ;
11241124 WorkerPool pool = new WorkerPool (workerExec , workerMetrics );
11251125 cf .add (completion -> {
@@ -1155,6 +1155,20 @@ private ThreadFactory createThreadFactory(VertxThreadFactory threadFactory, Bloc
11551155 };
11561156 }
11571157
1158+ /**
1159+ * Wrap the executor with {@link WrappedWorkerExecutorService} only when a custom
1160+ * {@link ExecutorServiceFactory} is used, since its threads may not be {@link VertxThread}
1161+ * instances (e.g. virtual threads) and need CHM-based identity registration for
1162+ * {@link VertxThread#isVertxThread()}, {@link VertxThread#isCurrentWorker()} etc. to work.
1163+ * Skipped for the default factory whose threads are already {@link VertxThread}.
1164+ */
1165+ private ExecutorService wrapWorkerExecutor (ExecutorService exec , ExecutorServiceFactory factory ) {
1166+ if (factory != ExecutorServiceFactory .INSTANCE ) {
1167+ return new WrappedWorkerExecutorService (exec , true , this );
1168+ }
1169+ return exec ;
1170+ }
1171+
11581172 @ Override
11591173 public Vertx exceptionHandler (Handler <Throwable > handler ) {
11601174 exceptionHandler = handler ;
0 commit comments