Class ExecutorConfigurationSupport
- All Implemented Interfaces:
Serializable
,ThreadFactory
,EventListener
,Aware
,BeanNameAware
,DisposableBean
,InitializingBean
,ApplicationContextAware
,ApplicationListener<ContextClosedEvent>
,Lifecycle
,Phased
,SmartLifecycle
- Direct Known Subclasses:
ScheduledExecutorFactoryBean
,ThreadPoolExecutorFactoryBean
,ThreadPoolTaskExecutor
,ThreadPoolTaskScheduler
ExecutorService
(typically a ThreadPoolExecutor
or
ScheduledThreadPoolExecutor
).
Defines common configuration settings and common lifecycle handling,
inheriting thread customization options (name, priority, etc) from
CustomizableThreadCreator
.
- Since:
- 3.0
- Author:
- Juergen Hoeller
- See Also:
-
Field Summary
Fields inherited from interface org.springframework.context.SmartLifecycle
DEFAULT_PHASE
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected void
afterExecute
(Runnable task, Throwable ex) An after-execute callback for framework subclasses to delegate to (for start/stop handling), and possibly also for custom subclasses to extend (making sure to call this implementation as well).void
Callsinitialize()
after the container applied all property values.protected void
beforeExecute
(Thread thread, Runnable task) A before-execute callback for framework subclasses to delegate to (for start/stop handling), and possibly also for custom subclasses to extend (making sure to call this implementation as well).protected void
cancelRemainingTask
(Runnable task) Cancel the given remaining task which never commended execution, as returned fromExecutorService.shutdownNow()
.void
destroy()
Callsshutdown
when the BeanFactory destroys the executor instance.int
getPhase()
Return the lifecycle phase for pausing and resuming this executor.void
Set up the ExecutorService.protected abstract ExecutorService
initializeExecutor
(ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) Create the targetExecutorService
instance.void
Initiate a shutdown on the underlying ExecutorService, rejecting further task submissions.boolean
Check whether this executor is not paused and has not been shut down either.void
ContextClosedEvent
handler for initiating an early shutdown.void
setAcceptTasksAfterContextClose
(boolean acceptTasksAfterContextClose) Set whether to accept further tasks after the application context close phase has begun.void
setApplicationContext
(ApplicationContext applicationContext) Set the ApplicationContext that this object runs in.void
setAwaitTerminationMillis
(long awaitTerminationMillis) Variant ofsetAwaitTerminationSeconds(int)
with millisecond precision.void
setAwaitTerminationSeconds
(int awaitTerminationSeconds) Set the maximum number of seconds that this executor is supposed to block on shutdown in order to wait for remaining tasks to complete their execution before the rest of the container continues to shut down.void
setBeanName
(String name) Set the name of the bean in the bean factory that created this bean.void
setPhase
(int phase) Specify the lifecycle phase for pausing and resuming this executor.void
setRejectedExecutionHandler
(RejectedExecutionHandler rejectedExecutionHandler) Set the RejectedExecutionHandler to use for the ExecutorService.void
setThreadFactory
(ThreadFactory threadFactory) Set the ThreadFactory to use for the ExecutorService's thread pool.void
setThreadNamePrefix
(String threadNamePrefix) Specify the prefix to use for the names of newly created threads.void
setWaitForTasksToCompleteOnShutdown
(boolean waitForJobsToCompleteOnShutdown) Set whether to wait for scheduled tasks to complete on shutdown, not interrupting running tasks and executing all tasks in the queue.void
shutdown()
Perform a full shutdown on the underlying ExecutorService, according to the corresponding configuration settings.void
start()
Resume this executor if paused before (otherwise a no-op).void
stop()
Pause this executor, not waiting for tasks to complete.void
Pause this executor, triggering the given callback once all currently executing tasks have completed.Methods inherited from class org.springframework.scheduling.concurrent.CustomizableThreadFactory
newThread
Methods inherited from class org.springframework.util.CustomizableThreadCreator
createThread, getDefaultThreadNamePrefix, getThreadGroup, getThreadNamePrefix, getThreadPriority, isDaemon, nextThreadName, setDaemon, setThreadGroup, setThreadGroupName, setThreadPriority
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.springframework.context.SmartLifecycle
isAutoStartup
-
Field Details
-
logger
-
-
Constructor Details
-
ExecutorConfigurationSupport
public ExecutorConfigurationSupport()
-
-
Method Details
-
setThreadFactory
Set the ThreadFactory to use for the ExecutorService's thread pool. Default is the underlying ExecutorService's default thread factory.In a Jakarta EE or other managed environment with JSR-236 support, consider specifying a JNDI-located ManagedThreadFactory: by default, to be found at "java:comp/DefaultManagedThreadFactory". Use the "jee:jndi-lookup" namespace element in XML or the programmatic
JndiLocatorDelegate
for convenient lookup. Alternatively, consider using Spring'sDefaultManagedAwareThreadFactory
with its fallback to local threads in case of no managed thread factory found. -
setThreadNamePrefix
Description copied from class:CustomizableThreadCreator
Specify the prefix to use for the names of newly created threads. Default is "SimpleAsyncTaskExecutor-".- Overrides:
setThreadNamePrefix
in classCustomizableThreadCreator
-
setRejectedExecutionHandler
public void setRejectedExecutionHandler(@Nullable RejectedExecutionHandler rejectedExecutionHandler) Set the RejectedExecutionHandler to use for the ExecutorService. Default is the ExecutorService's default abort policy.- See Also:
-
setAcceptTasksAfterContextClose
public void setAcceptTasksAfterContextClose(boolean acceptTasksAfterContextClose) Set whether to accept further tasks after the application context close phase has begun.Default is
false
as of 6.1, triggering an early soft shutdown of the executor and therefore rejecting any further task submissions. Switch this totrue
in order to let other components submit tasks even during their own destruction callbacks, at the expense of a longer shutdown phase. This will usually go along with"waitForTasksToCompleteOnShutdown"
.This flag will only have effect when the executor is running in a Spring application context and able to receive the
ContextClosedEvent
.- Since:
- 6.1
- See Also:
-
setWaitForTasksToCompleteOnShutdown
public void setWaitForTasksToCompleteOnShutdown(boolean waitForJobsToCompleteOnShutdown) Set whether to wait for scheduled tasks to complete on shutdown, not interrupting running tasks and executing all tasks in the queue.Default is
false
, shutting down immediately through interrupting ongoing tasks and clearing the queue. Switch this flag totrue
if you prefer fully completed tasks at the expense of a longer shutdown phase.Note that Spring's container shutdown continues while ongoing tasks are being completed. If you want this executor to block and wait for the termination of tasks before the rest of the container continues to shut down - e.g. in order to keep up other resources that your tasks may need -, set the
"awaitTerminationSeconds"
property instead of or in addition to this property. -
setAwaitTerminationSeconds
public void setAwaitTerminationSeconds(int awaitTerminationSeconds) Set the maximum number of seconds that this executor is supposed to block on shutdown in order to wait for remaining tasks to complete their execution before the rest of the container continues to shut down. This is particularly useful if your remaining tasks are likely to need access to other resources that are also managed by the container.By default, this executor won't wait for the termination of tasks at all. It will either shut down immediately, interrupting ongoing tasks and clearing the remaining task queue - or, if the
"waitForTasksToCompleteOnShutdown"
flag has been set totrue
, it will continue to fully execute all ongoing tasks as well as all remaining tasks in the queue, in parallel to the rest of the container shutting down.In either case, if you specify an await-termination period using this property, this executor will wait for the given time (max) for the termination of tasks. As a rule of thumb, specify a significantly higher timeout here if you set "waitForTasksToCompleteOnShutdown" to
true
at the same time, since all remaining tasks in the queue will still get executed - in contrast to the default shutdown behavior where it's just about waiting for currently executing tasks that aren't reacting to thread interruption. -
setAwaitTerminationMillis
public void setAwaitTerminationMillis(long awaitTerminationMillis) Variant ofsetAwaitTerminationSeconds(int)
with millisecond precision.- Since:
- 5.2.4
- See Also:
-
setPhase
public void setPhase(int phase) Specify the lifecycle phase for pausing and resuming this executor. The default isSmartLifecycle.DEFAULT_PHASE
.- Since:
- 6.1
- See Also:
-
getPhase
public int getPhase()Return the lifecycle phase for pausing and resuming this executor.- Specified by:
getPhase
in interfacePhased
- Specified by:
getPhase
in interfaceSmartLifecycle
- Since:
- 6.1
- See Also:
-
setBeanName
Description copied from interface:BeanNameAware
Set the name of the bean in the bean factory that created this bean.Invoked after population of normal bean properties but before an init callback such as
InitializingBean.afterPropertiesSet()
or a custom init-method.- Specified by:
setBeanName
in interfaceBeanNameAware
- Parameters:
name
- the name of the bean in the factory. Note that this name is the actual bean name used in the factory, which may differ from the originally specified name: in particular for inner bean names, the actual bean name might have been made unique through appending "#..." suffixes. Use theBeanFactoryUtils.originalBeanName(String)
method to extract the original bean name (without suffix), if desired.
-
setApplicationContext
Description copied from interface:ApplicationContextAware
Set the ApplicationContext that this object runs in. Normally this call will be used to initialize the object.Invoked after population of normal bean properties but before an init callback such as
InitializingBean.afterPropertiesSet()
or a custom init-method. Invoked afterResourceLoaderAware.setResourceLoader(org.springframework.core.io.ResourceLoader)
,ApplicationEventPublisherAware.setApplicationEventPublisher(org.springframework.context.ApplicationEventPublisher)
andMessageSourceAware
, if applicable.- Specified by:
setApplicationContext
in interfaceApplicationContextAware
- Parameters:
applicationContext
- the ApplicationContext object to be used by this object- See Also:
-
afterPropertiesSet
public void afterPropertiesSet()Callsinitialize()
after the container applied all property values.- Specified by:
afterPropertiesSet
in interfaceInitializingBean
- See Also:
-
initialize
public void initialize()Set up the ExecutorService. -
initializeExecutor
protected abstract ExecutorService initializeExecutor(ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) Create the targetExecutorService
instance. Called byafterPropertiesSet
.- Parameters:
threadFactory
- the ThreadFactory to userejectedExecutionHandler
- the RejectedExecutionHandler to use- Returns:
- a new ExecutorService instance
- See Also:
-
destroy
public void destroy()Callsshutdown
when the BeanFactory destroys the executor instance.- Specified by:
destroy
in interfaceDisposableBean
- See Also:
-
initiateShutdown
public void initiateShutdown()Initiate a shutdown on the underlying ExecutorService, rejecting further task submissions.The executor will not accept further tasks and will prevent further scheduling of periodic tasks, letting existing tasks complete still. This step is non-blocking and can be applied as an early shutdown signal before following up with a full
shutdown()
call later on.- Since:
- 6.1
- See Also:
-
shutdown
public void shutdown()Perform a full shutdown on the underlying ExecutorService, according to the corresponding configuration settings.This step potentially blocks for the configured termination period, waiting for remaining tasks to complete. For an early shutdown signal to not accept further tasks, call
initiateShutdown()
first. -
cancelRemainingTask
Cancel the given remaining task which never commended execution, as returned fromExecutorService.shutdownNow()
.- Parameters:
task
- the task to cancel (typically aRunnableFuture
)- Since:
- 5.0.5
- See Also:
-
start
public void start()Resume this executor if paused before (otherwise a no-op). -
stop
public void stop()Pause this executor, not waiting for tasks to complete. -
stop
Pause this executor, triggering the given callback once all currently executing tasks have completed.- Specified by:
stop
in interfaceSmartLifecycle
- Since:
- 6.1
- See Also:
-
isRunning
public boolean isRunning()Check whether this executor is not paused and has not been shut down either. -
beforeExecute
A before-execute callback for framework subclasses to delegate to (for start/stop handling), and possibly also for custom subclasses to extend (making sure to call this implementation as well).- Parameters:
thread
- the thread to run the tasktask
- the task to be executed- Since:
- 6.1
- See Also:
-
afterExecute
An after-execute callback for framework subclasses to delegate to (for start/stop handling), and possibly also for custom subclasses to extend (making sure to call this implementation as well).- Parameters:
task
- the task that has been executedex
- the exception thrown during execution, if any- Since:
- 6.1
- See Also:
-
onApplicationEvent
ContextClosedEvent
handler for initiating an early shutdown.- Specified by:
onApplicationEvent
in interfaceApplicationListener<ContextClosedEvent>
- Parameters:
event
- the event to respond to- Since:
- 6.1
- See Also:
-