Enjoying the Spring Tutorial?
Subscribe to Ram N Java for clean, hands-on Java & Spring guides!
SUBSCRIBE NOW1. Introduction to @Scheduled with Cron Expressions
The @Scheduled annotation provides one of the cleanest and most declarative approaches to scheduling jobs in Spring applications. Instead of managing complex trigger configurations, you can annotate any bean method directly with a cron pattern.
Using cron expressions allows you to pinpoint exact schedules—such as triggering tasks every 5 seconds, every weekday morning, or at midnight on the first day of each month.
2. Enabling Annotation-Driven Scheduling
To let the Spring container detect and execute methods marked with @Scheduled, you must enable task scheduling in your configuration.
In XML configuration, declare the task:annotation-driven element:
<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" />
<!-- Enable @Scheduled annotation processing -->
<task:annotation-driven />
</beans>
3. Implementing the Scheduled Service
Annotate your target method with @Scheduled(cron = "..."). Note that scheduled methods should return void and accept no arguments:
@Component("reportCurrentTime")
public class ReportCurrentTime {
// Runs every 5 seconds
@Scheduled(cron = "0/5 * * * * ?")
public void printCurrentTime() {
System.out.println("Cron Job Executed at: " + new Date());
}
}
4. Understanding Spring Cron Expression Syntax
Spring evaluates standard 6-field cron patterns in the following order:
- Second:
0-59(0/5executes every 5 seconds) - Minute:
0-59 - Hour:
0-23 - Day of Month:
1-31 - Month:
1-12orJAN-DEC - Day of Week:
1-7orSUN-SAT(?denotes no specific value)
5. Running and Verifying the Output
Run your application context. Once initialized, the background scheduler automatically fires your method at the exact intervals dictated by your cron expression, outputting formatted timestamps directly to the console.
Related Video Tutorials
Click here to watch on Youtube:
https://www.youtube.com/watch?v=pFpi-Fm23DU&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| How to schedule jobs using @Scheduled annotation (Cron expression) in spring? | Spring Tutorial |
| How to schedule jobs using @Scheduled annotation (Cron expression) in spring? | Spring Tutorial |
| How to schedule jobs using @Scheduled annotation (Cron expression) in spring? | Spring Tutorial |
| How to schedule jobs using @Scheduled annotation (Cron expression) in spring? | Spring Tutorial |
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
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class ScheduledTasks
{
private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
"HH:mm:ss");
@Scheduled(cron = "0 * * ? * *")
public void reportCurrentTime()
{
System.out.println(
"Current time = " + dateFormat.format(new Date()));
}
}
Spring-Scheduler.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<context:component-scan base-package="com.ram" />
</beans>
App.java
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
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4783da3f: startup date [Mon Dec 03 09:45:57 IST 2018]; root of context hierarchy
Dec 03, 2018 9:45:57 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Spring-Scheduler.xml]
Dec 03, 2018 9:45:58 AM org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor finishRegistration
INFO: No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
Current time = 09:46:00
Current time = 09:47:00
Current time = 09:48:00
Current time = 09:49:00
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_Annotation.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Schedule_CRON_Annotation
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/0989e369f77ed192b0b224588ebfcdeb2019a6a2/Spring_2018/SpringDemo_Schedule_CRON_Annotation/?at=master
See also: