diff --git a/buildSrc/gradle.properties b/buildSrc/gradle.properties index 6d5a3b6e645..72384038db8 100644 --- a/buildSrc/gradle.properties +++ b/buildSrc/gradle.properties @@ -1,3 +1,3 @@ # -#Thu Nov 20 11:29:35 CET 2025 -micronaut-build-version=8.0.0-M9 +#Tue Dec 09 15:41:49 IST 2025 +micronaut-build-version=8.0.0-M12 diff --git a/context/src/main/java/io/micronaut/scheduling/TaskExecutors.java b/context/src/main/java/io/micronaut/scheduling/TaskExecutors.java index 9f600d7b10a..570bd5c2fed 100644 --- a/context/src/main/java/io/micronaut/scheduling/TaskExecutors.java +++ b/context/src/main/java/io/micronaut/scheduling/TaskExecutors.java @@ -30,13 +30,16 @@ public interface TaskExecutors { String IO = "io"; /** + * @deprecated Since 5.0.0. Use {@link #VIRTUAL} instead on JDK 21+, or migrate to dedicated executors suited for your workload. * The name of the {@link java.util.concurrent.ExecutorService} used to schedule blocking tasks. * If available, this will use {@link #VIRTUAL virtual threads}. Otherwise, it will fall back to * {@link #IO}. */ + @Deprecated(since = "5.0.0") String BLOCKING = "blocking"; /** + * Recommended replacement for (@link #BLOCKING}) on JDK 21+. * Executor that runs tasks on virtual threads. This requires JDK 19+, and * {@code --enable-preview}. */ diff --git a/context/src/main/java/io/micronaut/scheduling/executor/DefaultExecutorSelector.java b/context/src/main/java/io/micronaut/scheduling/executor/DefaultExecutorSelector.java index 92fb0247e0e..4a30d1a2b81 100644 --- a/context/src/main/java/io/micronaut/scheduling/executor/DefaultExecutorSelector.java +++ b/context/src/main/java/io/micronaut/scheduling/executor/DefaultExecutorSelector.java @@ -59,7 +59,7 @@ public class DefaultExecutorSelector implements ExecutorSelector { protected DefaultExecutorSelector( BeanLocator beanLocator, @jakarta.inject.Named(TaskExecutors.IO) BeanProvider ioExecutor, - @jakarta.inject.Named(TaskExecutors.BLOCKING) BeanProvider blockingExecutor) { + @jakarta.inject.Named(TaskExecutors.VIRTUAL) BeanProvider blockingExecutor) { this.beanLocator = beanLocator; this.ioExecutor = SupplierUtil.memoized(ioExecutor::get); this.blockingExecutor = SupplierUtil.memoized(blockingExecutor::get); diff --git a/context/src/main/java/io/micronaut/scheduling/executor/IOExecutorServiceConfig.java b/context/src/main/java/io/micronaut/scheduling/executor/IOExecutorServiceConfig.java index c1ec79620ee..b9c614ce69d 100644 --- a/context/src/main/java/io/micronaut/scheduling/executor/IOExecutorServiceConfig.java +++ b/context/src/main/java/io/micronaut/scheduling/executor/IOExecutorServiceConfig.java @@ -68,8 +68,8 @@ ExecutorConfiguration virtual() { * @return The blocking executor */ @Singleton - @Named(TaskExecutors.BLOCKING) - @Requires(missingProperty = ExecutorConfiguration.PREFIX + "." + TaskExecutors.BLOCKING) + @Named(TaskExecutors.VIRTUAL) + @Requires(missingProperty = ExecutorConfiguration.PREFIX + "." + TaskExecutors.VIRTUAL) ExecutorService blocking( @Named(TaskExecutors.IO) BeanProvider io, @Named(TaskExecutors.VIRTUAL) BeanProvider virtual diff --git a/context/src/main/java/io/micronaut/scheduling/executor/ThreadSelection.java b/context/src/main/java/io/micronaut/scheduling/executor/ThreadSelection.java index 1db9e00b8bb..7b32e4bbb15 100644 --- a/context/src/main/java/io/micronaut/scheduling/executor/ThreadSelection.java +++ b/context/src/main/java/io/micronaut/scheduling/executor/ThreadSelection.java @@ -25,7 +25,7 @@ public enum ThreadSelection { /** * Automatically select the thread to run operations on based on the return type and/or {@link io.micronaut.core.annotation.Blocking} or {@link io.micronaut.core.annotation.NonBlocking} annotations. * - *

This is the default strategy in 1.x and will run operations on the {@link io.micronaut.scheduling.TaskExecutors#BLOCKING blocking executor} if the return type + *

This is the default strategy in 1.x and will run operations on the {@link io.micronaut.scheduling.TaskExecutors#VIRTUAL blocking executor} if the return type * of the method is not a reactive top and the method is not annotated with {@link io.micronaut.core.annotation.NonBlocking}

* *

If the return type is a reactive type and the method is not annotated with {@link io.micronaut.core.annotation.Blocking} then the server event loop thread will used to run the operation.

@@ -41,7 +41,7 @@ public enum ThreadSelection { */ IO, /** - * I/O selection will run all operations regardless of return type and annotations on the {@link io.micronaut.scheduling.TaskExecutors#BLOCKING blocking executor} and will never schedule an operation on the server event loop thread. + * I/O selection will run all operations regardless of return type and annotations on the {@link io.micronaut.scheduling.TaskExecutors#VIRTUAL blocking executor} and will never schedule an operation on the server event loop thread. */ BLOCKING } diff --git a/http-client-jdk/src/test/groovy/io/micronaut/http/client/jdk/HttpProxySpec.groovy b/http-client-jdk/src/test/groovy/io/micronaut/http/client/jdk/HttpProxySpec.groovy index d3236bff3dd..65d8c0c6f3e 100644 --- a/http-client-jdk/src/test/groovy/io/micronaut/http/client/jdk/HttpProxySpec.groovy +++ b/http-client-jdk/src/test/groovy/io/micronaut/http/client/jdk/HttpProxySpec.groovy @@ -68,7 +68,7 @@ class HttpProxySpec extends Specification { } @Get - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) String get(HttpRequest request) { "Proxied " + ctx.createBean(HttpClient, "http://localhost:${ctx.getBean(TargetPort).port}".toURI()) .toBlocking() diff --git a/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/ContinueTest.java b/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/ContinueTest.java index 1d09d02b6b8..842a14f079f 100644 --- a/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/ContinueTest.java +++ b/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/ContinueTest.java @@ -113,7 +113,7 @@ public void testContinueFormEncoded(boolean blocking) throws IOException { @Requires(property = "spec.name", value = SPEC_NAME) public static class SimpleController { @Post("/plain") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public String plain(@Body Publisher data) { return String.join("", Flux.from(data).collectList().block()); } diff --git a/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/RawTest.java b/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/RawTest.java index 9a8ac63cb7e..6bcc0f48652 100644 --- a/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/RawTest.java +++ b/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/RawTest.java @@ -124,7 +124,7 @@ public void echoLongInputStream() throws Exception { InputStreamByteBody.create( new ByteArrayInputStream(LONG_PAYLOAD), OptionalLong.of(LONG_PAYLOAD.length), - server.getApplicationContext().getBean(Executor.class, Qualifiers.byName(TaskExecutors.BLOCKING)), + server.getApplicationContext().getBean(Executor.class, Qualifiers.byName(TaskExecutors.VIRTUAL)), ByteBodyFactory.createDefault(ByteArrayBufferFactory.INSTANCE) ), null @@ -240,7 +240,7 @@ public HttpResponse filterRequestReplaceResponse(HttpRequest request, @Bod } @ResponseFilter("/filter-replace-response") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public HttpResponse filterReplaceResponse(HttpResponse response) throws Exception { try (ByteBodyHttpResponse r = (ByteBodyHttpResponse) response) { return HttpResponse.ok("Replaced response. Response body: " + r.byteBody().buffer().get().toString(StandardCharsets.UTF_8)); diff --git a/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/filter/ClientRequestFilterTest.java b/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/filter/ClientRequestFilterTest.java index 2b6bd210044..7968efc3a9b 100644 --- a/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/filter/ClientRequestFilterTest.java +++ b/http-client-tck/src/main/java/io/micronaut/http/client/tck/tests/filter/ClientRequestFilterTest.java @@ -418,7 +418,7 @@ public CompletionStage> requestFilterReplaceRequestCompletio } @RequestFilter("/request-filter/continuation-blocking") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public void requestFilterContinuationBlocking(MutableHttpRequest request, FilterContinuation> continuation) { request.header("foo", "bar"); HttpResponse r = continuation.proceed(); @@ -432,7 +432,7 @@ public Publisher> requestFilterContinuationReactivePublisher(Mut } @RequestFilter("/request-filter/continuation-update-request") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public void requestFilterContinuationUpdateRequest(FilterContinuation> continuation) { // won't affect the routing decision, but will appear in the controller continuation.request(HttpRequest.GET("/request-filter/continuation-update-request-2")); diff --git a/http-client/src/main/java/io/micronaut/http/client/netty/DefaultHttpClient.java b/http-client/src/main/java/io/micronaut/http/client/netty/DefaultHttpClient.java index c0a38f990e2..c40cfb9a5ee 100644 --- a/http-client/src/main/java/io/micronaut/http/client/netty/DefaultHttpClient.java +++ b/http-client/src/main/java/io/micronaut/http/client/netty/DefaultHttpClient.java @@ -594,7 +594,7 @@ public HttpResponse exchange(io.micronaut.http.HttpRequest reque You are trying to run a BlockingHttpClient operation on a netty event \ loop thread. This is a common cause for bugs: Event loops should \ never be blocked. You can either mark your controller as \ - @ExecuteOn(TaskExecutors.BLOCKING), or use the reactive HTTP client \ + @ExecuteOn(TaskExecutors.VIRTUAL), or use the reactive HTTP client \ to resolve this bug. There is also a configuration option to \ disable this check if you are certain a blocking operation is fine \ here."""); diff --git a/http-client/src/main/java/io/micronaut/http/client/netty/DefaultNettyHttpClientRegistry.java b/http-client/src/main/java/io/micronaut/http/client/netty/DefaultNettyHttpClientRegistry.java index 292df547030..e6588f9cbdc 100644 --- a/http-client/src/main/java/io/micronaut/http/client/netty/DefaultNettyHttpClientRegistry.java +++ b/http-client/src/main/java/io/micronaut/http/client/netty/DefaultNettyHttpClientRegistry.java @@ -174,7 +174,7 @@ public DefaultNettyHttpClientRegistry( EventLoopGroupFactory eventLoopGroupFactory, BeanContext beanContext, JsonMapper jsonMapper, - @Nullable @Named(TaskExecutors.BLOCKING) ExecutorService blockingExecutor) { + @Nullable @Named(TaskExecutors.VIRTUAL) ExecutorService blockingExecutor) { this.clientFilterResolver = httpClientFilterResolver; this.defaultHttpClientConfiguration = defaultHttpClientConfiguration; this.loadBalancerResolver = loadBalancerResolver; diff --git a/http-client/src/test/groovy/io/micronaut/http/client/NonMutableResponseSpec.groovy b/http-client/src/test/groovy/io/micronaut/http/client/NonMutableResponseSpec.groovy index 16fbc735c7f..6f790e73a59 100644 --- a/http-client/src/test/groovy/io/micronaut/http/client/NonMutableResponseSpec.groovy +++ b/http-client/src/test/groovy/io/micronaut/http/client/NonMutableResponseSpec.groovy @@ -63,7 +63,7 @@ class NonMutableResponseSpec extends Specification { ResponseClient responseClient @Get('/test/non-mutable') - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) HttpResponse go() { responseClient.go() } diff --git a/http-client/src/test/groovy/io/micronaut/http/client/ReadTimeoutSpec.groovy b/http-client/src/test/groovy/io/micronaut/http/client/ReadTimeoutSpec.groovy index fa6288c5f5f..6f74b7a795d 100644 --- a/http-client/src/test/groovy/io/micronaut/http/client/ReadTimeoutSpec.groovy +++ b/http-client/src/test/groovy/io/micronaut/http/client/ReadTimeoutSpec.groovy @@ -347,7 +347,7 @@ class ReadTimeoutSpec extends Specification { } @Get(value = "/client", produces = MediaType.TEXT_PLAIN) - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) String test() { return testClient.get() } diff --git a/http-client/src/test/groovy/io/micronaut/http/client/netty/StickyEventLoopSpec.groovy b/http-client/src/test/groovy/io/micronaut/http/client/netty/StickyEventLoopSpec.groovy index 5e4f1343c17..861cc71a61d 100644 --- a/http-client/src/test/groovy/io/micronaut/http/client/netty/StickyEventLoopSpec.groovy +++ b/http-client/src/test/groovy/io/micronaut/http/client/netty/StickyEventLoopSpec.groovy @@ -127,7 +127,7 @@ class StickyEventLoopSpec extends Specification { } @Get("/concurrent") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) def concurrent() { latch.countDown() latch.await() diff --git a/http-server-netty/src/main/java/io/micronaut/http/server/netty/NettyHttpServer.java b/http-server-netty/src/main/java/io/micronaut/http/server/netty/NettyHttpServer.java index ce7ef7b0dfa..3b0ae6c63b4 100644 --- a/http-server-netty/src/main/java/io/micronaut/http/server/netty/NettyHttpServer.java +++ b/http-server-netty/src/main/java/io/micronaut/http/server/netty/NettyHttpServer.java @@ -189,7 +189,7 @@ public NettyHttpServer( .getEventPublisher(HttpRequestReceivedEvent.class); final Supplier ioExecutor = SupplierUtil.memoized(() -> nettyEmbeddedServices.getExecutorSelector() - .select(TaskExecutors.BLOCKING).orElse(null) + .select(TaskExecutors.VIRTUAL).orElse(null) ); this.routingHandler = new RoutingInBoundHandler( serverConfiguration, diff --git a/http-server-netty/src/main/java/io/micronaut/http/server/netty/binders/NettyServerRequestBinderRegistry.java b/http-server-netty/src/main/java/io/micronaut/http/server/netty/binders/NettyServerRequestBinderRegistry.java index d1b54c389d8..32bb44013e4 100644 --- a/http-server-netty/src/main/java/io/micronaut/http/server/netty/binders/NettyServerRequestBinderRegistry.java +++ b/http-server-netty/src/main/java/io/micronaut/http/server/netty/binders/NettyServerRequestBinderRegistry.java @@ -53,7 +53,7 @@ public final class NettyServerRequestBinderRegistry implements RequestBinderRegi public NettyServerRequestBinderRegistry(ConversionService conversionService, List binders, BeanProvider httpServerConfiguration, - @Named(TaskExecutors.BLOCKING) + @Named(TaskExecutors.VIRTUAL) BeanProvider executorService, MessageBodyHandlerRegistry bodyHandlerRegistry) { diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/FormLimitSpec.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/FormLimitSpec.groovy index f606c1dff7a..833ada007a3 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/FormLimitSpec.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/FormLimitSpec.groovy @@ -105,7 +105,7 @@ class FormLimitSpec extends Specification { @Requires(property = "spec.name", value = "FormLimitSpec") static class MyCtrl { @Post - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) @Consumes([MediaType.APPLICATION_FORM_URLENCODED, MediaType.MULTIPART_FORM_DATA]) String post(@Body MultipartBody body) { return "attributes: " + Flux.from(body).doOnNext { it.getBytes() }.count().block() diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/LoomCarrierSpec.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/LoomCarrierSpec.groovy index 6591e108e92..69f2b758b30 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/LoomCarrierSpec.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/LoomCarrierSpec.groovy @@ -107,7 +107,7 @@ class LoomCarrierSpec extends Specification { @Inject JsonMapper jsonMapper - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) @Get ThreadInfo threadInfo() { return new ThreadInfo( @@ -116,7 +116,7 @@ class LoomCarrierSpec extends Specification { ) } - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) @Get("/loop-jdk") String loopJdk() { def scheduler = EventLoopVirtualThreadScheduler.current() @@ -138,13 +138,13 @@ class LoomCarrierSpec extends Specification { } } - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) @Get("/loop-mn") String loopMn() { return client.toBlocking().retrieve("/loom-carrier") } - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) @Get("/loop-read") LoopRead loopRead() { def before = threadInfo() diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/context/HttpClientFilterRequestInReactorContextSpec.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/context/HttpClientFilterRequestInReactorContextSpec.groovy index 7ddf60d0826..cc9cc785116 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/context/HttpClientFilterRequestInReactorContextSpec.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/context/HttpClientFilterRequestInReactorContextSpec.groovy @@ -115,7 +115,7 @@ class HttpClientFilterRequestInReactorContextSpec extends Specification { @Get("/foo") @Produces(MediaType.TEXT_PLAIN) @SingleResult - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) String foo() { fooClient.hello() } @@ -123,7 +123,7 @@ class HttpClientFilterRequestInReactorContextSpec extends Specification { @Get("/bar") @Produces(MediaType.TEXT_PLAIN) @SingleResult - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) String bar() { fooClient.hello() } diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/errors/handler/BlockingController.java b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/errors/handler/BlockingController.java index 01ecc773a71..9ab5c01b910 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/errors/handler/BlockingController.java +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/errors/handler/BlockingController.java @@ -9,7 +9,7 @@ @Requires(property = "spec.name", value = "PropagatedContextExceptionHandlerTest") @Controller("/blocking") -@ExecuteOn(TaskExecutors.BLOCKING) +@ExecuteOn(TaskExecutors.VIRTUAL) public class BlockingController { @Get diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FilterFormSpec.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FilterFormSpec.groovy index 40cdbac3ee9..a720f3b47ed 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FilterFormSpec.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FilterFormSpec.groovy @@ -48,7 +48,7 @@ class FilterFormSpec extends Specification { @ServerFilter("/form-error") static class Fltr { @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) void filterRequest() { } } diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec6.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec6.groovy index 505eed0d0c3..d94e1b151ad 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec6.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec6.groovy @@ -127,7 +127,7 @@ class FiltersPropagatedContextSpec6 extends Specification { static class Filter1 implements Ordered { @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) MutableHttpResponse myFilter(HttpRequest request, FilterContinuation> continuation) { try (PropagatedContext.Scope ignore = PropagatedContext.getOrEmpty().plus(new MyContext()).propagate()) { return continuation.request(request).proceed() diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec7.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec7.groovy index 391cd438d67..67179635c58 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec7.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec7.groovy @@ -122,7 +122,7 @@ class FiltersPropagatedContextSpec7 extends Specification { static class Filter1 { @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) MutableHttpResponse myFilter(HttpRequest request, FilterContinuation> continuation) { try (PropagatedContext.Scope ignore = PropagatedContext.getOrEmpty().plus(new MyContext()).propagate()) { return continuation.request(request).proceed() diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec8.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec8.groovy index 95d7fe2d026..8aeaa1bed31 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec8.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/FiltersPropagatedContextSpec8.groovy @@ -128,7 +128,7 @@ class FiltersPropagatedContextSpec8 extends Specification { static class Filter1 implements Ordered { @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) MutableHttpResponse myFilter(HttpRequest request, FilterContinuation> continuation, MutablePropagatedContext mutablePropagatedContext) { diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/ServerFilterSpec.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/ServerFilterSpec.groovy index c795bd6600c..c8265dccb0d 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/ServerFilterSpec.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/ServerFilterSpec.groovy @@ -139,7 +139,7 @@ class ServerFilterSpec extends Specification { @Singleton @Requires(property = "spec.name", value = "ServerFilterSpec") @ServerFilter("/blocking-filter/**") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) static class BlockingFilter { def events = new ArrayList() diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/ServerPreFilterSpec.groovy b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/ServerPreFilterSpec.groovy index 8a2d1fcb93b..ee3adceda69 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/ServerPreFilterSpec.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/filters/ServerPreFilterSpec.groovy @@ -196,7 +196,7 @@ class ServerPreFilterSpec extends Specification { @Singleton @Requires(property = "spec.name", value = "ServerPreFilterSpec") @ServerFilter("/blocking-filter/**") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) static class BlockingFilter { def events = new ArrayList() @@ -329,7 +329,7 @@ class ServerPreFilterSpec extends Specification { @Singleton @Requires(property = "spec.name", value = "ServerPreFilterSpec") @ServerFilter("/blocking-pre-matching-filter/**") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) static class BlockingPreMatchingFilter { def events = new ArrayList() diff --git a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/routing/MyController.java b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/routing/MyController.java index e9f918ec34f..b091e372153 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/routing/MyController.java +++ b/http-server-netty/src/test/groovy/io/micronaut/http/server/netty/routing/MyController.java @@ -12,7 +12,7 @@ @Requires(property = "spec.name", value = "RootRoutingTest") @Controller -@ExecuteOn(TaskExecutors.BLOCKING) +@ExecuteOn(TaskExecutors.VIRTUAL) public class MyController { @Post diff --git a/http-server-netty/src/test/groovy/io/micronaut/runtime/http/scope/RequestScopeSpec.groovy b/http-server-netty/src/test/groovy/io/micronaut/runtime/http/scope/RequestScopeSpec.groovy index 1e2dd925c35..bd9ac0aac0f 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/runtime/http/scope/RequestScopeSpec.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/runtime/http/scope/RequestScopeSpec.groovy @@ -229,7 +229,7 @@ class RequestScopeSpec extends AbstractMicronautSpec { } @Get("/test-simple-request-scope") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) String test() { return simpleRequestBean.sayHello() } diff --git a/http-server-netty/src/test/groovy/io/micronaut/websocket/WebsocketExecuteOnSpec.groovy b/http-server-netty/src/test/groovy/io/micronaut/websocket/WebsocketExecuteOnSpec.groovy index 5f4ae8b15b7..f87733c35b0 100644 --- a/http-server-netty/src/test/groovy/io/micronaut/websocket/WebsocketExecuteOnSpec.groovy +++ b/http-server-netty/src/test/groovy/io/micronaut/websocket/WebsocketExecuteOnSpec.groovy @@ -130,7 +130,7 @@ class WebsocketExecuteOnSpec extends Specification { @Requires(property = "spec.name", value = "WebsocketExecuteOnSpec") @ServerWebSocket("/echo/sync") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) static class SynchronousEchoServerWebSocket { @Inject @@ -167,7 +167,7 @@ class WebsocketExecuteOnSpec extends Specification { @Requires(property = "spec.name", value = "WebsocketExecuteOnSpec") @ServerWebSocket("/echo/reactive") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) static class ReactiveEchoServerWebSocket { @Inject @@ -211,7 +211,7 @@ class WebsocketExecuteOnSpec extends Specification { @Requires(property = "spec.name", value = "WebsocketExecuteOnSpec") @ServerWebSocket("/echo/async") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) static class AsyncEchoServerWebSocket { @Inject diff --git a/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/filter/RequestFilterTest.java b/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/filter/RequestFilterTest.java index fb1235698c7..7a4c89bf7ed 100644 --- a/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/filter/RequestFilterTest.java +++ b/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/filter/RequestFilterTest.java @@ -445,7 +445,7 @@ public void requestFilterImmediateRequestParameter(HttpRequest request) { } @RequestFilter("/request-filter/binding") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public void requestFilterBinding( @Header String contentType, @Body byte[] bytes, @@ -501,7 +501,7 @@ public CompletionStage> requestFilterReplaceRequestCompletio } @RequestFilter("/request-filter/continuation-blocking") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public void requestFilterContinuationBlocking(HttpRequest request, FilterContinuation> continuation) { request.setAttribute("foo", "bar"); HttpResponse r = continuation.proceed(); @@ -515,7 +515,7 @@ public Publisher> requestFilterContinuationReactivePublisher(Htt } @RequestFilter("/request-filter/continuation-update-request") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public void requestFilterContinuationUpdateRequest(FilterContinuation> continuation) { // won't affect the routing decision, but will appear in the controller continuation.request(HttpRequest.GET("/request-filter/continuation-update-request-2")); diff --git a/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/forms/FormUrlEncodedBodyInRequestFilterTest.java b/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/forms/FormUrlEncodedBodyInRequestFilterTest.java index 2450fd04e2f..f8040fd58c1 100644 --- a/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/forms/FormUrlEncodedBodyInRequestFilterTest.java +++ b/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/forms/FormUrlEncodedBodyInRequestFilterTest.java @@ -116,7 +116,7 @@ static class CsrfFilter { this.bodyParser = bodyParser; } - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) @RequestFilter @Nullable public HttpResponse csrfFilter(@NonNull HttpRequest request) { diff --git a/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/forms/UploadTest.java b/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/forms/UploadTest.java index 5f255e54a20..e58f9c7a573 100644 --- a/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/forms/UploadTest.java +++ b/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/forms/UploadTest.java @@ -75,7 +75,7 @@ public void inputStream() throws Exception { public static class UploadController { @Consumes(MediaType.MULTIPART_FORM_DATA) @Post("/input-stream") - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) byte[] inputStream(StreamingFileUpload file) throws Exception { try (InputStream stream = file.asInputStream()) { return stream.readAllBytes(); diff --git a/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/routing/RootRoutingTest.java b/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/routing/RootRoutingTest.java index 9925f344c1d..02dadf8457d 100644 --- a/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/routing/RootRoutingTest.java +++ b/http-server-tck/src/main/java/io/micronaut/http/server/tck/tests/routing/RootRoutingTest.java @@ -56,7 +56,7 @@ void testRouting() throws IOException { @Requires(property = "spec.name", value = SPEC_NAME) @Controller - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) static class MyController { @Post diff --git a/http-server/src/main/java/io/micronaut/http/server/body/InputStreamBodyWriter.java b/http-server/src/main/java/io/micronaut/http/server/body/InputStreamBodyWriter.java index 8210fd9a0a6..9ebc52c5b75 100644 --- a/http-server/src/main/java/io/micronaut/http/server/body/InputStreamBodyWriter.java +++ b/http-server/src/main/java/io/micronaut/http/server/body/InputStreamBodyWriter.java @@ -50,7 +50,7 @@ public final class InputStreamBodyWriter extends AbstractFileBodyWriter implements ResponseBodyWriter { private final ExecutorService executorService; - InputStreamBodyWriter(HttpServerConfiguration.FileTypeHandlerConfiguration configuration, @Named(TaskExecutors.BLOCKING) ExecutorService executorService) { + InputStreamBodyWriter(HttpServerConfiguration.FileTypeHandlerConfiguration configuration, @Named(TaskExecutors.VIRTUAL) ExecutorService executorService) { super(configuration); this.executorService = executorService; } diff --git a/http-server/src/main/java/io/micronaut/http/server/body/StreamFileBodyWriter.java b/http-server/src/main/java/io/micronaut/http/server/body/StreamFileBodyWriter.java index 6a536dcdae6..6453deac6f1 100644 --- a/http-server/src/main/java/io/micronaut/http/server/body/StreamFileBodyWriter.java +++ b/http-server/src/main/java/io/micronaut/http/server/body/StreamFileBodyWriter.java @@ -54,7 +54,7 @@ public final class StreamFileBodyWriter extends AbstractFileBodyWriter implements ResponseBodyWriter { private final ExecutorService ioExecutor; - StreamFileBodyWriter(HttpServerConfiguration.FileTypeHandlerConfiguration configuration, @Named(TaskExecutors.BLOCKING) ExecutorService ioExecutor) { + StreamFileBodyWriter(HttpServerConfiguration.FileTypeHandlerConfiguration configuration, @Named(TaskExecutors.VIRTUAL) ExecutorService ioExecutor) { super(configuration); this.ioExecutor = ioExecutor; } diff --git a/http-server/src/main/java/io/micronaut/http/server/body/SystemFileBodyWriter.java b/http-server/src/main/java/io/micronaut/http/server/body/SystemFileBodyWriter.java index 376e3eb64ca..e35590ae28a 100644 --- a/http-server/src/main/java/io/micronaut/http/server/body/SystemFileBodyWriter.java +++ b/http-server/src/main/java/io/micronaut/http/server/body/SystemFileBodyWriter.java @@ -68,7 +68,7 @@ public final class SystemFileBodyWriter extends AbstractFileBodyWriter implement private final ExecutorService ioExecutor; - public SystemFileBodyWriter(HttpServerConfiguration.FileTypeHandlerConfiguration configuration, @Named(TaskExecutors.BLOCKING) ExecutorService ioExecutor) { + public SystemFileBodyWriter(HttpServerConfiguration.FileTypeHandlerConfiguration configuration, @Named(TaskExecutors.VIRTUAL) ExecutorService ioExecutor) { super(configuration); this.ioExecutor = ioExecutor; } diff --git a/http/src/main/java/io/micronaut/http/body/stream/PublisherAsBlocking.java b/http/src/main/java/io/micronaut/http/body/stream/PublisherAsBlocking.java index 35a24076231..6a358efc1d1 100644 --- a/http/src/main/java/io/micronaut/http/body/stream/PublisherAsBlocking.java +++ b/http/src/main/java/io/micronaut/http/body/stream/PublisherAsBlocking.java @@ -158,7 +158,7 @@ public ReadBuffer take() throws InterruptedException { } if (demanded) { if (Thread.currentThread() instanceof NonBlocking) { - throw new IllegalStateException("Attempted to do blocking operation on a thread marked as NonBlocking. (Maybe the netty event loop?) Please only run blocking operations on IO or virtual threads, for example by marking your controller with @ExecuteOn(TaskExecutors.BLOCKING)."); + throw new IllegalStateException("Attempted to do blocking operation on a thread marked as NonBlocking. (Maybe the netty event loop?) Please only run blocking operations on IO or virtual threads, for example by marking your controller with @ExecuteOn(TaskExecutors.VIRTUAL)."); } newDataCondition.await(); } diff --git a/http/src/main/java/io/micronaut/http/ssl/FileCertificateProvider.java b/http/src/main/java/io/micronaut/http/ssl/FileCertificateProvider.java index 3985e016823..45a210b9e83 100644 --- a/http/src/main/java/io/micronaut/http/ssl/FileCertificateProvider.java +++ b/http/src/main/java/io/micronaut/http/ssl/FileCertificateProvider.java @@ -78,7 +78,7 @@ public final class FileCertificateProvider implements CertificateProvider { FileCertificateProvider( @NonNull Config config, @NonNull @jakarta.inject.Named(TaskExecutors.SCHEDULED) ExecutorService scheduler, - @NonNull @jakarta.inject.Named(TaskExecutors.BLOCKING) Executor blockingExecutor + @NonNull @jakarta.inject.Named(TaskExecutors.VIRTUAL) Executor blockingExecutor ) throws Exception { if (config.refreshMode == RefreshMode.NONE) { flux = Flux.just(load(config)); diff --git a/management/src/main/java/io/micronaut/management/health/indicator/AbstractHealthIndicator.java b/management/src/main/java/io/micronaut/management/health/indicator/AbstractHealthIndicator.java index 9fc496f2155..ebc260e7936 100644 --- a/management/src/main/java/io/micronaut/management/health/indicator/AbstractHealthIndicator.java +++ b/management/src/main/java/io/micronaut/management/health/indicator/AbstractHealthIndicator.java @@ -41,7 +41,7 @@ public abstract class AbstractHealthIndicator implements HealthIndicator { * @param executorService The executor service */ @Inject - public void setExecutorService(@Named(TaskExecutors.BLOCKING) ExecutorService executorService) { + public void setExecutorService(@Named(TaskExecutors.VIRTUAL) ExecutorService executorService) { this.executorService = executorService; } diff --git a/management/src/main/java/io/micronaut/management/health/indicator/jdbc/JdbcIndicator.java b/management/src/main/java/io/micronaut/management/health/indicator/jdbc/JdbcIndicator.java index 78575b77301..533f3413df7 100644 --- a/management/src/main/java/io/micronaut/management/health/indicator/jdbc/JdbcIndicator.java +++ b/management/src/main/java/io/micronaut/management/health/indicator/jdbc/JdbcIndicator.java @@ -71,7 +71,7 @@ public class JdbcIndicator implements HealthIndicator { * @param dataSourceResolver The data source resolver * @param healthAggregator The health aggregator */ - public JdbcIndicator(@Named(TaskExecutors.BLOCKING) ExecutorService executorService, + public JdbcIndicator(@Named(TaskExecutors.VIRTUAL) ExecutorService executorService, DataSource[] dataSources, @Nullable DataSourceResolver dataSourceResolver, HealthAggregator healthAggregator) { diff --git a/src/main/docs/guide/httpServer/byteBody/byteBodyPrimary.adoc b/src/main/docs/guide/httpServer/byteBody/byteBodyPrimary.adoc index 9b295e021e6..d4457294650 100644 --- a/src/main/docs/guide/httpServer/byteBody/byteBodyPrimary.adoc +++ b/src/main/docs/guide/httpServer/byteBody/byteBodyPrimary.adoc @@ -7,7 +7,7 @@ of byte arrays or `ByteBuffer`s. WARNING: `InputStream` is blocking API, and the netty event loop must never be blocked. If you wish to read from the body using an `InputStream`, take care to do so only on another thread, or to annotate your filter with -`@ExecuteOn(TaskExecutors.BLOCKING)`. +`@ExecuteOn(TaskExecutors.VIRTUAL)`. If you need full access to the body, the `buffer()` method returns a `CompletableFuture` that completes with an `AvailableByteBody` when the full body has been received. `AvailableByteBody` has a few more convenient diff --git a/test-suite-groovy/src/test/groovy/io/micronaut/docs/client/filter/GoogleAuthFilter.groovy b/test-suite-groovy/src/test/groovy/io/micronaut/docs/client/filter/GoogleAuthFilter.groovy index c839cba9fbb..5e9f7f86ae8 100644 --- a/test-suite-groovy/src/test/groovy/io/micronaut/docs/client/filter/GoogleAuthFilter.groovy +++ b/test-suite-groovy/src/test/groovy/io/micronaut/docs/client/filter/GoogleAuthFilter.groovy @@ -24,7 +24,7 @@ class GoogleAuthFilter { } @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) void filter(MutableHttpRequest request) { String authURI = encodeURI(request) String token = authClientProvider.get().toBlocking().retrieve(HttpRequest.GET(authURI).header( // <2> diff --git a/test-suite-groovy/src/test/groovy/io/micronaut/docs/server/filters/filtermethods/TraceFilter.groovy b/test-suite-groovy/src/test/groovy/io/micronaut/docs/server/filters/filtermethods/TraceFilter.groovy index 8ba056b3731..9e0dd6fa452 100644 --- a/test-suite-groovy/src/test/groovy/io/micronaut/docs/server/filters/filtermethods/TraceFilter.groovy +++ b/test-suite-groovy/src/test/groovy/io/micronaut/docs/server/filters/filtermethods/TraceFilter.groovy @@ -43,7 +43,7 @@ class TraceFilter { } @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) // <3> + @ExecuteOn(TaskExecutors.VIRTUAL) // <3> void filterRequest(HttpRequest request) { traceService.trace(request) // <4> } diff --git a/test-suite-groovy/src/test/groovy/io/micronaut/docs/server/filters/filtermethods/continuations/TraceFilter.groovy b/test-suite-groovy/src/test/groovy/io/micronaut/docs/server/filters/filtermethods/continuations/TraceFilter.groovy index ff9ade139cb..d191d4b0786 100644 --- a/test-suite-groovy/src/test/groovy/io/micronaut/docs/server/filters/filtermethods/continuations/TraceFilter.groovy +++ b/test-suite-groovy/src/test/groovy/io/micronaut/docs/server/filters/filtermethods/continuations/TraceFilter.groovy @@ -45,7 +45,7 @@ class TraceFilter { // tag::doFilter[] @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) // <4> + @ExecuteOn(TaskExecutors.VIRTUAL) // <4> void filterRequest(HttpRequest request, FilterContinuation> continuation) { // <1> traceService.trace(request) MutableHttpResponse res = continuation.proceed(); // <2> diff --git a/test-suite-groovy/src/test/groovy/io/micronaut/docs/taskexecutors/HelloWorldController.groovy b/test-suite-groovy/src/test/groovy/io/micronaut/docs/taskexecutors/HelloWorldController.groovy index 30d5f4bcfd9..00bf319ca03 100644 --- a/test-suite-groovy/src/test/groovy/io/micronaut/docs/taskexecutors/HelloWorldController.groovy +++ b/test-suite-groovy/src/test/groovy/io/micronaut/docs/taskexecutors/HelloWorldController.groovy @@ -12,7 +12,7 @@ import io.micronaut.scheduling.annotation.ExecuteOn @Controller("/hello") class HelloWorldController { - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) @Produces(MediaType.TEXT_PLAIN) @Get("/world") String index() { diff --git a/test-suite/src/test/groovy/io/micronaut/upload/UploadController.java b/test-suite/src/test/groovy/io/micronaut/upload/UploadController.java index 8a2ca7d6060..ccdab2ac4ed 100644 --- a/test-suite/src/test/groovy/io/micronaut/upload/UploadController.java +++ b/test-suite/src/test/groovy/io/micronaut/upload/UploadController.java @@ -89,7 +89,7 @@ public Publisher> receiveFileUpload(StreamingFileUpload d } @Post(value = "/receive-file-upload-input-stream", consumes = MediaType.MULTIPART_FORM_DATA, produces = MediaType.TEXT_PLAIN) - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public String receiveFileUploadInputStream(StreamingFileUpload data) throws IOException { try (InputStream stream = data.asInputStream()) { return new String(stream.readAllBytes(), StandardCharsets.UTF_8); diff --git a/test-suite/src/test/java/io/micronaut/docs/client/filter/GoogleAuthFilter.java b/test-suite/src/test/java/io/micronaut/docs/client/filter/GoogleAuthFilter.java index e7734f43f64..c0dbdcea1e8 100644 --- a/test-suite/src/test/java/io/micronaut/docs/client/filter/GoogleAuthFilter.java +++ b/test-suite/src/test/java/io/micronaut/docs/client/filter/GoogleAuthFilter.java @@ -43,7 +43,7 @@ public GoogleAuthFilter(BeanProvider httpClientProvider) { // <1> } @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) public void filter(MutableHttpRequest request) throws Exception { String uri = encodeURI(request); String t = authClientProvider.get().toBlocking().retrieve(HttpRequest.GET(uri) // <2> diff --git a/test-suite/src/test/java/io/micronaut/docs/server/filters/filtermethods/TraceFilter.java b/test-suite/src/test/java/io/micronaut/docs/server/filters/filtermethods/TraceFilter.java index 0f93a04353b..c34498213bc 100644 --- a/test-suite/src/test/java/io/micronaut/docs/server/filters/filtermethods/TraceFilter.java +++ b/test-suite/src/test/java/io/micronaut/docs/server/filters/filtermethods/TraceFilter.java @@ -39,7 +39,7 @@ public TraceFilter(TraceService traceService) { // <2> } @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) // <3> + @ExecuteOn(TaskExecutors.VIRTUAL) // <3> public void filterRequest(HttpRequest request) { traceService.trace(request); // <4> } diff --git a/test-suite/src/test/java/io/micronaut/docs/server/filters/filtermethods/continuations/TraceFilter.java b/test-suite/src/test/java/io/micronaut/docs/server/filters/filtermethods/continuations/TraceFilter.java index e40bc215e73..de23e4ac91c 100644 --- a/test-suite/src/test/java/io/micronaut/docs/server/filters/filtermethods/continuations/TraceFilter.java +++ b/test-suite/src/test/java/io/micronaut/docs/server/filters/filtermethods/continuations/TraceFilter.java @@ -39,7 +39,7 @@ public TraceFilter(TraceService traceService) { // <2> // tag::doFilter[] @RequestFilter - @ExecuteOn(TaskExecutors.BLOCKING) // <4> + @ExecuteOn(TaskExecutors.VIRTUAL) // <4> public void filterRequest(HttpRequest request, FilterContinuation> continuation) { // <1> traceService.trace(request); MutableHttpResponse res = continuation.proceed(); // <2> diff --git a/test-suite/src/test/java/io/micronaut/docs/taskexecutors/HelloWorldController.java b/test-suite/src/test/java/io/micronaut/docs/taskexecutors/HelloWorldController.java index 2f42dab4b23..f38ecddf504 100644 --- a/test-suite/src/test/java/io/micronaut/docs/taskexecutors/HelloWorldController.java +++ b/test-suite/src/test/java/io/micronaut/docs/taskexecutors/HelloWorldController.java @@ -12,7 +12,7 @@ @Controller("/hello") class HelloWorldController { - @ExecuteOn(TaskExecutors.BLOCKING) + @ExecuteOn(TaskExecutors.VIRTUAL) @Produces(MediaType.TEXT_PLAIN) @Get("/world") String index() {