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
+43-12Lines changed: 43 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,46 @@ 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
+
[NOTE]
9
+
====
10
+
The auto-configured javadoc:org.springframework.core.task.AsyncTaskExecutor[] will be used for all integrations unless a custom javadoc:java.util.concurrent.Executor[] bean is provided.
11
+
====
12
+
13
+
14
+
Although this works in most cases, Spring Boot provides the option to override the auto-configured javadoc:org.springframework.core.task.AsyncTaskExecutor[]. By default, when a custom javadoc:java.util.concurrent.Executor[] bean is registered, the auto-configured javadoc:org.springframework.core.task.AsyncTaskExecutor[] backs off, and custom javadoc:java.util.concurrent.Executor[] will be used for regular task execution (via javadoc:org.springframework.scheduling.annotation.EnableAsync[format=annotation]). However, Spring MVC, Spring WebFlux, and Spring GraphQL all require a bean named `applicationTaskExecutor`. For Spring MVC and Spring WebFlux, this bean must be of type javadoc:org.springframework.core.task.AsyncTaskExecutor[], whereas Spring GraphQL does not have this requirement.
15
+
16
+
The following code snippet demonstrates how to register a custom javadoc:org.springframework.core.task.AsyncTaskExecutor[] to be used with Spring MVC, Spring WebFlux and Spring GraphQL.
The `applicationTaskExecutor` above will be used for regular task execution as well if there is no `@Primary` bean or a bean named `taskExecutor` of type javadoc:java.util.concurrent.Executor[] is registered in the application context.
23
+
====
24
+
25
+
If your application needs multiple javadoc:java.util.concurrent.Executor[] beans for different purposes and configurations, such as one for regular task execution (`@EnableAsync`) and another for Spring MVC, this can be achieved with the following configuration:
The auto-configured javadoc:org.springframework.boot.task.ThreadPoolTaskExecutorBuilder[] or javadoc:org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder[] allow you to easily create instances
32
+
of type javadoc:org.springframework.core.task.AsyncTaskExecutor[] that replicate the default behavior of auto-configuration.
33
+
====
34
+
35
+
[WARNING]
36
+
====
37
+
If neither the auto-configured `AsyncTaskExecutor` nor the bean named `applicationTaskExecutor` is defined, only regular task execution fallbacks to a bean named `taskExecutor` to match Spring Framework's behavior.
38
+
====
39
+
40
+
If a bean named `taskExecutor` cannot be used, you can register an javadoc:org.springframework.scheduling.annotation.AsyncConfigurer[] bean to specify which `Executor` should handle regular task execution with `@EnableAsync`.
41
+
42
+
To register a custom javadoc:java.util.concurrent.Executor[] while keeping the auto-configured javadoc:org.springframework.core.task.AsyncTaskExecutor[], you can create a custom javadoc:java.util.concurrent.Executor[] bean and set the `defaultCandidate=false` attribute in its javadoc:org.springframework.context.annotation.Bean[format=annotation] annotation, as demonstrated in the following example.
If for some reason, it is not possible, you can request Spring Boot to auto-configure an `AsyncTaskExecutor` anyway, as follows:
9
48
10
49
[configprops,yaml]
11
50
----
@@ -15,7 +54,7 @@ spring:
15
54
mode: force
16
55
----
17
56
18
-
The auto-configured executor will be automatically used for:
57
+
The auto-configured javadoc:org.springframework.core.task.AsyncTaskExecutor[] will be automatically used for:
19
58
20
59
- Asynchronous task execution (`@EnableAsync`), unless an javadoc:org.springframework.scheduling.annotation.AsyncConfigurer[] bean is present.
21
60
- Spring for GraphQL's asynchronous handling of javadoc:java.util.concurrent.Callable[] return values from controller methods.
@@ -24,22 +63,14 @@ The auto-configured executor will be automatically used for:
24
63
25
64
[TIP]
26
65
====
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
66
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
67
====
35
68
36
-
[NOTE]
69
+
[WARNING]
37
70
====
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.
71
+
When `force` mode is enabled, `applicationTaskExecutor` will also be configured for regular task execution with `@EnableAsync`, even if a `@Primary` bean or a bean named `taskExecutor` of type javadoc:java.util.concurrent.Executor[] is present. The only way to override the `Executor` for regular tasks is by registering an javadoc:org.springframework.scheduling.annotation.AsyncConfigurer[] bean.
40
72
====
41
73
42
-
43
74
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
75
Those default settings can be fine-tuned using the `spring.task.execution` namespace, as shown in the following example:
0 commit comments