Showing posts with label Task Scheduler. Show all posts
Showing posts with label Task Scheduler. Show all posts

Monday, 17 December 2018

Spring Job Scheduling using Task Scheduler - Cron expression (XML Config) | Spring tutorial

Enjoying the Spring Tutorial?

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

SUBSCRIBE NOW

1. Introduction to Spring Task Scheduler with Cron Expression

Spring provides built-in task scheduling support via the task namespace, allowing you to trigger background tasks without external third-party libraries. When you need complex scheduling conditions—such as running a job at specific seconds, minutes, hours, or days—cron expressions offer the ultimate flexibility.

In this tutorial, you will discover how to configure a Spring task:scheduler and execute bean methods using XML-based cron triggers.

2. Creating the Service Component

First, define a simple Spring bean that contains the task method you want to execute periodically:

@Component("reportCurrentTime")
public class ReportCurrentTime {

    public void printCurrentTime() {
        System.out.println("Cron Task Executed at: " + new Date());
    }
}

3. Configuring Spring XML with the Task Namespace

To configure scheduling, declare the task schema in your XML configuration and set up task:scheduler alongside task:scheduled-tasks:

<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 Task Scheduler Pool Size -->
    <task:scheduler id="myScheduler" pool-size="5" />

    <!-- Configure Scheduled Tasks using Cron Expression -->
    <task:scheduled-tasks scheduler="myScheduler">
        <task:scheduled ref="reportCurrentTime" 
                        method="printCurrentTime" 
                        cron="0/5 * * * * ?" />
    </task:scheduled-tasks>

</beans>

4. Understanding the Cron Expression Syntax

Spring's cron expression consists of 6 fields:

  • second: 0-59 (e.g., 0/5 fires every 5 seconds)
  • minute: 0-59
  • hour: 0-23
  • day of month: 1-31
  • month: 1-12 or JAN-DEC
  • day of week: 1-7 or SUN-SAT (? indicates no specific value)

5. Running and Verifying the Setup

Bootstrap your application by loading the Spring XML context with ClassPathXmlApplicationContext. The configured scheduler thread pool automatically schedules your target method according to the specified cron expression.


Related Video Tutorials


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

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

Spring Job Scheduling using Task Scheduler - Cron expression (XML Config) | Spring tutorial

Spring Job Scheduling using Task Scheduler - Cron expression (XML Config) | Spring 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"
            cron="*/10 * * * * MON-FRI" />
    </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

Dec 04, 2018 9:16:37 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4783da3f: startup date [Tue Dec 04 09:16:37 IST 2018]; root of context hierarchy
Dec 04, 2018 9:16:37 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Spring-Scheduler.xml]
Dec 04, 2018 9:16:38 AM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize
INFO: Initializing ExecutorService  'myScheduler'
Current time = 09:16:40
Current time = 09:16:50
Current time = 09:17:00
Current time = 09:17:10

Refer: 
https://www.freeformatter.com/cron-expression-generator-quartz.html
 
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_Schedule_CRON_XML.zip?attredirects=0&d=1

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

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/0989e369f77ed192b0b224588ebfcdeb2019a6a2/Spring_2018/SpringDemo_Schedule_CRON_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
  • 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
  • Saturday, 8 December 2018

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

    Master Spring & Java Programming!

    Subscribe to Ram N Java for clean, hands-on developer tutorials!

    🔔 Subscribe to Ram N Java

    Overview: Task Scheduling via XML Configuration

    While modern Spring projects often rely on annotations, understanding XML-based configuration remains vital for maintaining legacy applications and gaining a thorough grasp of how Spring manages background tasks under the hood.

    In this guide, you will learn how to configure a recurring background job in Spring using <task:scheduler> and <task:scheduled-tasks> to run repeatedly at a fixed rate.

    What Does "Fixed Rate" Mean?

    A fixed rate execution means the task is scheduled to start at strict periodic intervals—regardless of whether the previous execution has finished.

    • Independent Invocations: The beginning of each task execution does not wait for the prior run to complete.
    • Best Use Cases: Ideal for lightweight, periodic tasks that do not depend on the output or state of the preceding execution (such as timestamp logging, heartbeat checks, or health monitoring).

    Key Elements of the XML Setup

    1. Bean Definition: Define your worker bean (e.g., scheduledTasks) containing the target method you wish to trigger.
    2. <task:scheduler>: Declares the thread pool scheduler executor that Spring manages.
    3. <task:scheduled>: Maps the specific bean, method (e.g., reportCurrentTime), and sets the fixed-rate interval (in milliseconds).

    Recommended Next Videos from Ram N Java


    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-rate="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 24, 2018 10:36:48 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4783da3f: startup date [Sat Nov 24 10:36:48 IST 2018]; root of context hierarchy
    Nov 24, 2018 10:36:48 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [Spring-Scheduler.xml]
    Nov 24, 2018 10:36:49 AM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize
    INFO: Initializing ExecutorService  'myScheduler'
    Current time = 10:36:49
    Current time = 10:36:54
    Current time = 10:36:59
    Current time = 10:37:04
    Current time = 10:37:09

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

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

    Bitbucket Link:
    https://bitbucket.org/ramram43210/spring/src/0989e369f77ed192b0b224588ebfcdeb2019a6a2/Spring_2018/SpringDemo_Schedule_FixedRate_XML_Config/?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
  • Tutorials