Saturday, 15 December 2018

Spring Job Scheduling using Task Scheduler - Fixed delay (XML Config) | Spring Scheduler tutorial

Enjoying the Spring Tutorial?

Subscribe to Ram N Java for clean, hands-on Java & Spring guides!

SUBSCRIBE NOW

1. Understanding Fixed Delay in Spring Scheduling

When running repetitive background jobs, you often need to ensure that a task never executes concurrently with itself. With fixed-delay scheduling, the delay timer starts only after the previous task run has fully completed.

Spring's task namespace provides a declarative XML way to manage this behavior using task:scheduler and fixed-delay attributes without having to write extra boilerplate code.

2. Creating the Service Bean

Create a simple Spring-managed component that contains the task method you want to execute repeatedly:

@Component("reportCurrentTime")
public class ReportCurrentTime {

    public void printCurrentTime() {
        System.out.println("Fixed Delay Task executed at: " + new Date());
    }
}

3. Configuring Fixed Delay via Spring XML

In your Spring application context XML, configure the task:scheduler pool and declare the scheduled task with the fixed-delay attribute (value in milliseconds):

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/task 
           http://www.springframework.org/schema/task/spring-task.xsd">

    <context:component-scan base-package="com.ram.scheduler" />

    <!-- Define scheduler pool -->
    <task:scheduler id="myScheduler" pool-size="5" />

    <!-- Schedule task with fixed-delay (e.g., 3000ms = 3 seconds) -->
    <task:scheduled-tasks scheduler="myScheduler">
        <task:scheduled ref="reportCurrentTime" 
                        method="printCurrentTime" 
                        fixed-delay="3000" />
    </task:scheduled-tasks>

</beans>

4. Fixed Delay vs Fixed Rate: Key Differences

  • fixed-delay: Waits for the specified duration after the previous execution finishes before triggering the next run. Ideal for long-running jobs that must not overlap.
  • fixed-rate: Executes the job at fixed intervals measuring from the start time of the previous execution, regardless of how long the job takes.

5. Running and Verifying Output

Load your XML configuration using ClassPathXmlApplicationContext. The Spring scheduler thread pool will immediately invoke your task method and repeat it every 3 seconds after each completed execution.


Related Video Tutorials


Click here to watch on Youtube:
https://www.youtube.com/watch?v=3wp4PKJ1rdI&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge:
Spring Job Scheduling using Task Scheduler - Fixed Rate (XML Config) | Spring Scheduler tutorial

Spring Job Scheduling using Task Scheduler - Fixed Rate (XML Config) | Spring Scheduler tutorial

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ram.core</groupId>
    <artifactId>SpringDemo</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>SpringDemo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <spring.version>5.0.9.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>


        <!-- Spring 5 dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>

    </dependencies>

</project>

ScheduledTasks.java

package com.ram.scheduler;

import java.text.SimpleDateFormat;
import java.util.Date;


public class ScheduledTasks
{
   
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
            "HH:mm:ss");

    public void reportCurrentTime()
    {
        System.out.println(
                "Current time = " + dateFormat.format(new Date()));
    }
}

Spring-Scheduler.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.0.xsd">


    <bean id="scheduledTasks" class="com.ram.scheduler.ScheduledTasks" />

    <!-- Configure the scheduler -->
    <task:scheduler id="myScheduler" pool-size="10" />

    <!-- Configure parameters -->
    <task:scheduled-tasks scheduler="myScheduler">
        <task:scheduled ref="scheduledTasks" method="reportCurrentTime"
            fixed-delay="5000" />
    </task:scheduled-tasks>

</beans>

App.java

package com.ram.core;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "Spring-Scheduler.xml");
    }
}

Output

Nov 26, 2018 10:13:37 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4783da3f: startup date [Mon Nov 26 10:13:37 IST 2018]; root of context hierarchy
Nov 26, 2018 10:13:37 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Spring-Scheduler.xml]
Nov 26, 2018 10:13:38 AM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize
INFO: Initializing ExecutorService  'myScheduler'
Current time = 10:13:38
Current time = 10:13:43
Current time = 10:13:48
Current time = 10:13:53

Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_Schedule_FixedDelay_XML.zip?attredirects=0&d=1

Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Schedule_FixedDelay_XML

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/0989e369f77ed192b0b224588ebfcdeb2019a6a2/Spring_2018/SpringDemo_Schedule_FixedDelay_XML/?at=master

See also:

  • All JavaEE Videos Playlist
  • All JavaEE Videos
  • All JAVA EE Links
  • Spring Tutorial
  • Servlets Tutorial
  • All Design Patterns Links
  • JDBC Tutorial
  • Java Collection Framework Tutorial
  • JAVA Tutorial
  • Kids Tutorial
  • Cooking Tutorial
  • No comments:

    Post a Comment

    Tutorials