I need to cancel Spring timer execution or at least change the execution frequency based on some conditions. Was using both org.springframework.scheduling.quartz.SimpleTriggerBean
and org.springframework.scheduling.timer.ScheduledTimerTask
. Cannot find the way how to do it.
3 Answers
NOTE: This is for Spring 3.0+
Use a
TaskScheduler
service, such as aTimerManagerTaskScheduler
orThreadPoolTaskScheduler
.Schedule your task by calling some
TaskScheduler.schedule*()
method and store the returningScheduledFuture
.When you want to cancel execution, invoke
ScheduledFuture.cancel()
. That will stop further invocations of your task. At this time, you can reschedule if you want by callingTaskScheduler.schedule*()
for your task with different parameters.
-
My beans are provisioned in the spring xml file. How I get an instance of the TaskScheduler from there? Are you saying that I need to provision it all in my Java code? – BigWonder Dec 13 '12 at 22:40
-
Just instantiate the TaskScheduler using a `
` element and inject it wherever you want to use it – gpeche Dec 15 '12 at 20:48 -
Note, the boolean parameter of `cancel()` method is [mayInterruptIfRunning](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#cancel-boolean-) – Klesun Sep 13 '22 at 07:03
This is by far not the best solution but if you can't come up with anything else you could always use a boolean that would be checked each time the event is fired and if the boolean is false the run method of the timertask should immediately terminate.

- 187
- 1
- 1
- 10
-
That's what I actually did. This approach is definitely not preferable as I don't want to execute task again if some condition is met. – BigWonder Dec 13 '12 at 21:47
The solution is to assign an id to the org.springframework.scheduling.timer.TimerFactoryBean and then retrieve this bean from the application, cast it to Timer and call cancel method on that object.

- 225
- 1
- 4
- 18