Using #Schedule in spring - spring

Hello i working on a cron job and would like to schedule the task to run once every two weeks on a Monday morning using #schedule in spring can anyone help me out here?

You should check out the getting started examples in the spring.io website:
Scheduling Tasks
For your use case you'll be using the scheduled annotation with a cron expression:
#Scheduled(cron=". . .")
This uses the CronSequenceGenerator.

As the other answer mentioned you just have to add the #Scheduled annotation. however if using spring boot dont forget to add this anotation #EnableScheduling in the main class of your app
#EnableScheduling
#EnableAutoConfiguration
public class MyApplication {
Hope it helps

If you use not springboot but spring framework, you can configure scheduling job like below.
#EnableScheduling
#Configuration
public class SchedulingConfig {
// ...
}
And use like this.
private static final int TEN_MINUTES = 60 * 10 * 1000;
#Scheduled(fixedRate = TEN_MINUTES)
public void doSomething() {
// ...
}

Regarding the cron expression for every two weeks, here're some discussion.
It seems not very convenient to use cron expression to set two weeks schedule. Instead, you can use cron expression to set weekly tasks, and use a boolean variable to flip the boolean value:
boolean flag;
// run the method at 8:00 AM every Monday
#Scheduled(cron="0 0 8 * * MON")
public void schedulingTask() {
// run the actual task only if flag is true
if (flag) {
// handle the biweekly task
}
// flip the flag
flag = !flag;
}

Related

Update Cron expression runtime in SpringBoot #Scheduled

#Configuration
#EnableScheduling
public class CustomScheduler {
#Autowired
private IAppUpdateService appUpdateService;
#Scheduled(cron = "#{#appUpdateService.findCroExpById()}")
public void job1() {
System.out.println(new Date());
}
}
Above snippet dosent work properly as expected is there any way to achieve this or any other approach is available!!!
I want to achieve like to retrieve cron expression from db at runtime.
User may change cron timing through UI,thats why i want to fetch it through service.
You can create a bean to get the values from database and use the bean in the corn. Detailed example is in the link :
http://mbcoder.com/dynamic-task-scheduling-with-spring/

Call a Scheduled Async bean method in a running application

I've got an Async method which is scheduled to run once a day:
#Component
public class MyClass {
//myCronProperty set to "0 25 20 * * *" in application.properties
#Scheduled(cron="{myCronProperty}")
#Async
#Override
public void doDailyTask() {
//Do work here
}
}
Is there a way of triggering doDailyTask() for testing purposes when the application is already running, perhaps by doing something clever with Groovy and reflection?
I figure I can always tweak the cron property to 1 minute in the future in my application.properties file, and then restart the application - but just wondered if there was a smarter method?
You should be able to simply inject the component into another class, for example a #RestController, and invoke the doDailyTask() method on it there.

how to call a method automatically in every seconds using spring boot?

In Spring-boot project, is there a method that want to make it called every seconds automatically?
And make an rest-api to set calling term in same project?
Here comes an example.
The greeting method will be executed every 5 seconds and it can be called when you visit /hello endpoint.
#SpringBootApplication
#EnableScheduling
#RestController
public class So47301079 {
public static void main(String[] args) {
SpringApplication.run(So47301079.class, args);
}
#Scheduled(fixedRate = 5000)
#GetMapping(value="/hello")
public void greeting() {
System.out.println("Hello!!!");
}
}
Hope this helps you!
Can use cron expression like #Scheduled(cron="*/5 * * * * *"). In this way, we have a control on minutes, hours, days also. Have a look at this video to know different possible ways to use cron expression.

How to program the spring MVC cron without annotation

package com.test.cron;
#Service
public class CronJob {
protected static final Logger logger = Logger.getLogger(CronJob.class);
#Scheduled(cron="0 0 23 * * *")
public void demoServiceMethod()
{
logger.debug("Cron job started.");
}
}
Cron excution time will be often changed.
I have to exchange '#Scheduled' annotation to java code.
You can externalize this cron value into a properties file.
#Scheduled(cron="${schedularTime}")
and in your properties file ( example: application-dev.properties)
schedularTime=0 0/2 * * * ?
Old thread, but there is no real answer to the question.
Here is a way to schedule jobs without any annotations.
The example is in Kotlin, but works the same way in java.
#Component
class CliRunner(
private val scheduler: ThreadPoolTaskScheduler,
private val scheduledService: ScheduledService
) : CommandLineRunner {
override fun run(vararg args: String) {
scheduler.scheduleAtFixedRate(scheduledService::run, 10_000)
}
}
Inject ThreadPoolTaskScheduler and whatever you want to schedule, and call any of the scheduling methods on the scheduler.
My example schedules the run method to be executed every 10 seconds.
You could use a database for the configuration of schedule, Quartz had a capability to save its job meta data in a datasource.
Somebody had implemented something like this here.
https://github.com/davidkiss/spring-boot-quartz-demo

Spring MVC 3 Time scheduled task starting at a specific time

I want to schedule a method call in Spring MVC to run after every two hours. This I can easily do via Spring 3.0 Time Scheduler. However, I want to kick the execution off only at a specific time of the day. That is, the method should only be invoked every 2 hours starting at a particular time.
For example - I want the method to run every 2 hours starting 6 AM.
The TimeScheduler interface has a scheduleAtFixedRate method which is overloaded to use startTime Date argument. I am not really sure how to use this.
Any idea how this can be achieved ?
You could take a look at the TaskScheduler interface. It provides a method scheduleAtFixedRate(Runnable task, Date startTime, long period) which returns a ScheduledFuture. You can use this with some simple Spring configuration:
<task:scheduler id="scheduler" pool-size="10"/>
This will create an instance of ThreadPoolTaskScheduler which implements TaskScheduler. Wire this bad boy into the class to call your specific method:
public class MyClass {
#Autowired
private TaskScheduler scheduler;
public void init() {
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
myMethod();
}
}, new Date(), 1000 * 60 * 60 * 2); //This will start now and run every two hours
}
public void myMethod() {
// the method you want to invoke
}
}
I would take a look at Spring's support for Task Execution and Scheduling. Specifically check out the #Scheduled annotation (with which you can specify a schedule based on a cron expression):
#Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should execute on weekdays only
}

Resources