You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/features/task-execution-and-scheduling.adoc
+76-12Lines changed: 76 additions & 12 deletions
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,74 @@ In the absence of an javadoc:java.util.concurrent.Executor[] bean in the context
5
5
When virtual threads are enabled (using Java 21+ and configprop:spring.threads.virtual.enabled[] set to `true`) this will be a javadoc:org.springframework.core.task.SimpleAsyncTaskExecutor[] that uses virtual threads.
6
6
Otherwise, it will be a javadoc:org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor[] with sensible defaults.
7
7
8
-
If a custom `Executor` bean is present, you can request Spring Boot to auto-configure an `AsyncTaskExecutor` anyway, as follows:
8
+
The auto-configured javadoc:org.springframework.core.task.AsyncTaskExecutor[] is used for
9
+
the following integrations unless a custom javadoc:java.util.concurrent.Executor[] bean is defined:
10
+
11
+
- Execution of asynchronous tasks using `@EnableAsync`, unless a bean of type javadoc:org.springframework.scheduling.annotation.AsyncConfigurer[] is defined.
12
+
- Asynchronous handling of javadoc:java.util.concurrent.Callable[] return values from controller methods in Spring for GraphQL.
13
+
- Asynchronous request handling in Spring MVC.
14
+
- Support for blocking execution in Spring WebFlux.
15
+
16
+
While this approach works in most scenarios, Spring Boot allows you to override the auto-configured
17
+
javadoc:org.springframework.core.task.AsyncTaskExecutor[]. By default, when a custom
18
+
javadoc:java.util.concurrent.Executor[] bean is registered, the auto-configured
19
+
javadoc:org.springframework.core.task.AsyncTaskExecutor[] steps aside, and the custom
20
+
javadoc:java.util.concurrent.Executor[] is used for regular task execution (via `@EnableAsync`).
21
+
However, Spring MVC, Spring WebFlux, and Spring GraphQL all require a bean named `applicationTaskExecutor`.
22
+
For Spring MVC and Spring WebFlux, this bean must be of type javadoc:org.springframework.core.task.AsyncTaskExecutor[],
23
+
whereas Spring GraphQL does not enforce this type requirement.
24
+
25
+
The following code snippet demonstrates how to register a custom javadoc:org.springframework.core.task.AsyncTaskExecutor[]
26
+
to be used with Spring MVC, Spring WebFlux, Spring GraphQL:
If for some reason, it is not possible, you can request Spring Boot to auto-configure an `AsyncTaskExecutor` anyway, as follows:
9
76
10
77
[configprops,yaml]
11
78
----
@@ -15,7 +82,9 @@ spring:
15
82
mode: force
16
83
----
17
84
18
-
The auto-configured executor will be automatically used for:
85
+
The auto-configured javadoc:org.springframework.core.task.AsyncTaskExecutor[] will be used automatically
86
+
for all integrations, even if a custom javadoc:java.util.concurrent.Executor[] bean is registered,
87
+
including those marked as `@Primary`. These integrations include:
19
88
20
89
- Asynchronous task execution (`@EnableAsync`), unless an javadoc:org.springframework.scheduling.annotation.AsyncConfigurer[] bean is present.
21
90
- Spring for GraphQL's asynchronous handling of javadoc:java.util.concurrent.Callable[] return values from controller methods.
@@ -24,22 +93,17 @@ The auto-configured executor will be automatically used for:
24
93
25
94
[TIP]
26
95
====
27
-
If you have defined a custom javadoc:java.util.concurrent.Executor[] in the context, both regular task execution (that is javadoc:org.springframework.scheduling.annotation.EnableAsync[format=annotation]) and Spring for GraphQL will use it.
28
-
However, the Spring MVC and Spring WebFlux support will only use it if it is an javadoc:org.springframework.core.task.AsyncTaskExecutor[] implementation named `applicationTaskExecutor`.
29
-
30
96
Depending on your target arrangement, you could set configprop:spring.task.execution.mode[] to `force` to auto-configure an `applicationTaskExecutor`, change your javadoc:java.util.concurrent.Executor[] into an javadoc:org.springframework.core.task.AsyncTaskExecutor[] or define both an javadoc:org.springframework.core.task.AsyncTaskExecutor[] and an javadoc:org.springframework.scheduling.annotation.AsyncConfigurer[] wrapping your custom javadoc:java.util.concurrent.Executor[].
31
-
32
-
Another option is to define those beans explicitly.
33
-
The auto-configured javadoc:org.springframework.boot.task.ThreadPoolTaskExecutorBuilder[] or javadoc:org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder[] allow you to easily create instances that reproduce what the auto-configuration does by default.
34
97
====
35
98
36
-
[NOTE]
99
+
[WARNING]
37
100
====
38
-
If multiple javadoc:java.util.concurrent.Executor[] beans are defined with configprop:spring.task.execution.mode[] to `force`, all the supported integrations look for a bean named `applicationTaskExecutor`.
39
-
If the auto-configured `AsyncTaskExecutor` is not defined, only regular task execution fallbacks to a bean named `taskExecutor` to match Spring Framework's behavior.
101
+
When `force` mode is enabled, `applicationTaskExecutor` will also be configured for regular
102
+
task execution with `@EnableAsync`, even if a `@Primary` bean or a bean named `taskExecutor`
103
+
of type javadoc:java.util.concurrent.Executor[] is present. The only way to override the `Executor`
104
+
for regular tasks is by registering an javadoc:org.springframework.scheduling.annotation.AsyncConfigurer[] bean.
40
105
====
41
106
42
-
43
107
When a javadoc:org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor[] is auto-configured, the thread pool uses 8 core threads that can grow and shrink according to the load.
44
108
Those default settings can be fine-tuned using the `spring.task.execution` namespace, as shown in the following example:
0 commit comments