How to cancel Spring timer execution
Asked Answered
P

3

11

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.

Phosphorite answered 13/12, 2012 at 20:52 Comment(0)
H
22

NOTE: This is for Spring 3.0+

  1. Read Spring documentation on scheduling tasks

  2. Use a TaskScheduler service, such as a TimerManagerTaskScheduler or ThreadPoolTaskScheduler.

  3. Schedule your task by calling some TaskScheduler.schedule*() method and store the returning ScheduledFuture.

  4. 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 calling TaskScheduler.schedule*() for your task with different parameters.

Hazing answered 13/12, 2012 at 22:7 Comment(3)
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?Phosphorite
Just instantiate the TaskScheduler using a <bean> element and inject it wherever you want to use itHazing
Note, the boolean parameter of cancel() method is mayInterruptIfRunningTurnery
M
0

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.

Mytilene answered 13/12, 2012 at 21:44 Comment(1)
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.Phosphorite
P
0

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.

Phosphorite answered 20/12, 2012 at 14:19 Comment(1)
<task:scheduler id="myScheduler" /> Then you can get myScheduler and cancel().Electrical

© 2022 - 2024 — McMap. All rights reserved.