Spring Book – Chapter 19 – Tasks and Scheduling

Spring Configuration

Like other configurations in Spring, asynchronous execution and scheduling of tasks can be done in following ways, namely XML, Annotation and Java based. We will cover XML and annotation based configuration support provided by Spring in this section of the chapter. For XML-based configuration, we will see the namespace support and for annotation-based configuration, we will see important annotations provided by the Spring Framework.

XML-based

Spring 3.0 introduced new XML namespace for asynchronous execution and scheduling of tasks in the form of task namespace.

Namespace <task: />

We will now examine various tags in the task namespace in some detail with code snippets so as to understand these tags more clearly.

Element “scheduler”

The “scheduler” defines a ThreadPoolTaskScheduler instance with configurable pool size. Te various attributes in this element is shown in the Table 20-1 below.

Table 20-1. Attributes of element “scheduler”

Element Use Type Description
Id Required String The bean name for the generated ThreadPoolTaskScheduler instance. It will also be used as the default thread name prefix.
pool-size Optional String The size of the ScheduledExecutorService’s thread pool. The default is 1.

Element “executor”

The “executor” element defines a ThreadPoolTaskExecutor instance with configurable pool size, queue-capacity, keep-alive, and rejection-policy values. The various attributes in this element is shown in Table 20-1 below.

Table 20-1. Attributes of element “executor”

Element Use Type Description
Id Required String The bean name for the generated ThreadPoolTaskExecutor instance. This value will also be used as the thread name prefix which is why it is required even when defining the executor as an inner bean: The executor won’t be directly accessible then but will nevertheless use the specified id as the thread name prefix of the threads that it manages.
pool-size Optional String The size of the executor’s thread pool as either a single value or a range (e.g. 5-10). If no bounded queue-capacity value is provided, then a max value has no effect unless the range is specified as 0-n. In that case, the core pool will have a size of n, but the ‘allowCoreThreadTimeout’ flag will be set to true. If a queue-capacity is provided, then the lower bound of a range will map to the core size and the upper bound will map to the max size. If this attribute is not provided, the default core size will be 1, and the default max size will be Integer.MAX_VALUE (i.e. unbounded).
queue-capacity Optional String Queue capacity for the ThreadPoolTaskExecutor. If not specified, the default will be Integer.MAX_VALUE (i.e. unbounded).
keep-alive Optional String Keep-alive time in seconds. Inactive threads that have been created beyond the core size will timeout after the specified number of seconds elapse. If the executor has an unbounded queue capacity and a size range represented as 0-n, then the core threads will also be configured to timeout when inactive. Otherwise, core threads will not ever timeout.
rejection-policy Optional The RejectedExecutionHandler type. When a bounded queue cannot accept any additional tasks, this determines the behavior. While the default is ABORT, consider using CALLER_RUNS to throttle inbound tasks. In other words, by forcing the caller to run the task itself, it will not be able to provide another task until after it completes the task at hand. In the meantime, one or more tasks may be removed from the queue. Alternatively, if it is not critical to run every task, consider using DISCARD to drop the current task or DISCARD_OLDEST to drop the task at the head of the queue.

Element “scheduled-task”

It is one of the top-level element that contains one or more task sub-elements to be managed by a given TaskScheduler. The sub-element namely “scheduled” is required atleast once and maximum of any number. It has a mandatory element namely “scheduler”, which refers to an instance of org.springframework.scheduling.TaskScheduler to manage the provided tasks. If not specified, the default value will be a wrapper for a single-threaded Executor.

Sub-Element “scheduled”

It is the sub-element defining a scheduled method-invoking task and its corresponding trigger. Te various attributes in this element is shown in the Table 20-1 below.

Table 20-1. Attributes of sub-element “scheduled”

Element Use Type Description
cron Optional String A cron-based trigger. See the org.springframework.scheduling.support.CronSequenceGenerator JavaDoc for example patterns.
fixed-delay Optional String An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.
fixed-rate Optional String An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.
ref Required String Reference to an object that provides a method to be invoked.
method Required String The name of the method to be invoked.

Element “annotation-driven”

This element enables the detection of @Async and @Scheduled annotations on any Spring-managed object. If present, a proxy will be generated for executing the annotated methods asynchronously. The various attributes in the element “annotation-driven” is shown in Table 20-1 below.

Table 20-1. Attributes of element “annotation-driven”

Element Use Type Description
executor Optional String Specifies the java.util.Executor instance to use when invoking asynchronous methods. If not provided, an instance of org.springframework.core.task.SimpleAsyncTaskExecutor will be used by default.
scheduler Optional String Specifies the org.springframework.scheduling.TaskScheduler or java.util.ScheduledExecutorService instance to use when invoking scheduled methods. If no reference is provided, a TaskScheduler backed by a single thread scheduled executor will be used.
mode Should annotated beans be proxied using Spring’s AOP framework, or should they rather be weaved with an AspectJ async execution aspect? AspectJ weaving requires spring-aspects.jar on the classpath, as well as load-time weaving (or compile-time weaving) enabled. Note: The weaving-based aspect requires the @Async annotation to be defined on the concrete class. Annotations in interfaces will not work in that case (they will rather only work with interface-based proxies). Default value of this attribute is “proxy”. Other value possible is “aspectj”.
proxy-target-class Boolean Are class-based (CGLIB) proxies to be created? By default, standard Java interface-based proxies are created. Note: Class-based proxies require the @Async annotation to be defined on the concrete class. Annotations in interfaces will not work in that case (they will rather only work with interface-based proxies)

Page Visitors: 23869

The following two tabs change content below.
Tomcy John

Tomcy John

Blogger & Author at javacodebook
He is an Enterprise Java Specialist holding a degree in Engineering (B-Tech) with over 10 years of experience in several industries. He's currently working as Principal Architect at Emirates Group IT since 2005. Prior to this he has worked with Oracle Corporation and Ernst & Young. His main specialization is on various web technologies and acts as chief mentor and Architect to facilitate incorporating Spring as Corporate Standard in the organization.
Tomcy John

Latest posts by Tomcy John (see all)

Leave a Reply

Your email address will not be published. Required fields are marked *