|
27 | 27 |
|
28 | 28 | import org.springframework.scheduling.TaskScheduler;
|
29 | 29 | import org.springframework.scheduling.Trigger;
|
| 30 | +import org.springframework.scheduling.support.DelegatingErrorHandlingRunnable; |
| 31 | +import org.springframework.scheduling.support.ErrorHandler; |
30 | 32 | import org.springframework.scheduling.support.SimpleTriggerContext;
|
31 | 33 |
|
32 | 34 | /**
|
33 | 35 | * Implementation of Spring's {@link TaskScheduler} interface, wrapping
|
34 | 36 | * a CommonJ {@link commonj.timers.TimerManager}.
|
35 | 37 | *
|
36 | 38 | * @author Juergen Hoeller
|
| 39 | + * @author Mark Fisher |
37 | 40 | * @since 3.0
|
38 | 41 | */
|
39 | 42 | public class TimerManagerTaskScheduler extends TimerManagerAccessor implements TaskScheduler {
|
40 | 43 |
|
| 44 | + private volatile ErrorHandler errorHandler; |
| 45 | + |
| 46 | + public void setErrorHandler(ErrorHandler errorHandler) { |
| 47 | + this.errorHandler = errorHandler; |
| 48 | + } |
| 49 | + |
41 | 50 | public ScheduledFuture schedule(Runnable task, Trigger trigger) {
|
42 |
| - return new ReschedulingTimerListener(task, trigger).schedule(); |
| 51 | + return new ReschedulingTimerListener(errorHandlingTask(task, true), trigger).schedule(); |
43 | 52 | }
|
44 | 53 |
|
45 | 54 | public ScheduledFuture schedule(Runnable task, Date startTime) {
|
46 |
| - TimerScheduledFuture futureTask = new TimerScheduledFuture(task); |
| 55 | + TimerScheduledFuture futureTask = new TimerScheduledFuture(errorHandlingTask(task, false)); |
47 | 56 | Timer timer = getTimerManager().schedule(futureTask, startTime);
|
48 | 57 | futureTask.setTimer(timer);
|
49 | 58 | return futureTask;
|
50 | 59 | }
|
51 | 60 |
|
52 | 61 | public ScheduledFuture scheduleAtFixedRate(Runnable task, Date startTime, long period) {
|
53 |
| - TimerScheduledFuture futureTask = new TimerScheduledFuture(task); |
| 62 | + TimerScheduledFuture futureTask = new TimerScheduledFuture(errorHandlingTask(task, true)); |
54 | 63 | Timer timer = getTimerManager().scheduleAtFixedRate(futureTask, startTime, period);
|
55 | 64 | futureTask.setTimer(timer);
|
56 | 65 | return futureTask;
|
57 | 66 | }
|
58 | 67 |
|
59 | 68 | public ScheduledFuture scheduleAtFixedRate(Runnable task, long period) {
|
60 |
| - TimerScheduledFuture futureTask = new TimerScheduledFuture(task); |
| 69 | + TimerScheduledFuture futureTask = new TimerScheduledFuture(errorHandlingTask(task, true)); |
61 | 70 | Timer timer = getTimerManager().scheduleAtFixedRate(futureTask, 0, period);
|
62 | 71 | futureTask.setTimer(timer);
|
63 | 72 | return futureTask;
|
64 | 73 | }
|
65 | 74 |
|
66 | 75 | public ScheduledFuture scheduleWithFixedDelay(Runnable task, Date startTime, long delay) {
|
67 |
| - TimerScheduledFuture futureTask = new TimerScheduledFuture(task); |
| 76 | + TimerScheduledFuture futureTask = new TimerScheduledFuture(errorHandlingTask(task, true)); |
68 | 77 | Timer timer = getTimerManager().schedule(futureTask, startTime, delay);
|
69 | 78 | futureTask.setTimer(timer);
|
70 | 79 | return futureTask;
|
71 | 80 | }
|
72 | 81 |
|
73 | 82 | public ScheduledFuture scheduleWithFixedDelay(Runnable task, long delay) {
|
74 |
| - TimerScheduledFuture futureTask = new TimerScheduledFuture(task); |
| 83 | + TimerScheduledFuture futureTask = new TimerScheduledFuture(errorHandlingTask(task, true)); |
75 | 84 | Timer timer = getTimerManager().schedule(futureTask, 0, delay);
|
76 | 85 | futureTask.setTimer(timer);
|
77 | 86 | return futureTask;
|
78 | 87 | }
|
79 | 88 |
|
| 89 | + private Runnable errorHandlingTask(Runnable delegate, boolean isRepeatingTask) { |
| 90 | + ErrorHandler errorHandler = this.errorHandler != null ? this.errorHandler |
| 91 | + : (isRepeatingTask ? ErrorHandler.LOG_AND_SUPPRESS : ErrorHandler.LOG_AND_PROPAGATE); |
| 92 | + return new DelegatingErrorHandlingRunnable(delegate, errorHandler); |
| 93 | + } |
| 94 | + |
80 | 95 |
|
81 | 96 | /**
|
82 | 97 | * ScheduledFuture adapter that wraps a CommonJ Timer.
|
|
0 commit comments