Skip to content

Commit fa72f90

Browse files
committed
Avoid NPE when a PeriodicTrigger has no initial delay
Closes gh-36081
1 parent 93f8bd2 commit fa72f90

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/scheduling/ScheduledTasksEndpoint.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.actuate.scheduling;
1818

1919
import java.lang.reflect.Method;
20+
import java.time.Duration;
2021
import java.util.Collection;
2122
import java.util.Collections;
2223
import java.util.LinkedHashMap;
@@ -186,7 +187,8 @@ protected IntervalTaskDescriptor(TaskType type, IntervalTask task) {
186187

187188
protected IntervalTaskDescriptor(TaskType type, TriggerTask task, PeriodicTrigger trigger) {
188189
super(type, task.getRunnable());
189-
this.initialDelay = trigger.getInitialDelayDuration().toMillis();
190+
Duration initialDelayDuration = trigger.getInitialDelayDuration();
191+
this.initialDelay = (initialDelayDuration != null) ? initialDelayDuration.toMillis() : 0;
190192
this.interval = trigger.getPeriodDuration().toMillis();
191193
}
192194

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/scheduling/ScheduledTasksEndpointTests.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,20 @@ void fixedDelayTriggerIsReported() {
113113
});
114114
}
115115

116+
@Test
117+
void noInitialDelayFixedDelayTriggerIsReported() {
118+
run(NoInitialDelayFixedDelayTriggerTask.class, (tasks) -> {
119+
assertThat(tasks.getCron()).isEmpty();
120+
assertThat(tasks.getFixedRate()).isEmpty();
121+
assertThat(tasks.getCustom()).isEmpty();
122+
assertThat(tasks.getFixedDelay()).hasSize(1);
123+
FixedDelayTaskDescriptor description = (FixedDelayTaskDescriptor) tasks.getFixedDelay().get(0);
124+
assertThat(description.getInitialDelay()).isEqualTo(0);
125+
assertThat(description.getInterval()).isEqualTo(1000);
126+
assertThat(description.getRunnable().getTarget()).isEqualTo(FixedDelayTriggerRunnable.class.getName());
127+
});
128+
}
129+
116130
@Test
117131
void fixedRateScheduledMethodIsReported() {
118132
run(FixedRateScheduledMethod.class, (tasks) -> {
@@ -142,6 +156,20 @@ void fixedRateTriggerIsReported() {
142156
});
143157
}
144158

159+
@Test
160+
void noInitialDelayFixedRateTriggerIsReported() {
161+
run(NoInitialDelayFixedRateTriggerTask.class, (tasks) -> {
162+
assertThat(tasks.getCron()).isEmpty();
163+
assertThat(tasks.getFixedDelay()).isEmpty();
164+
assertThat(tasks.getCustom()).isEmpty();
165+
assertThat(tasks.getFixedRate()).hasSize(1);
166+
FixedRateTaskDescriptor description = (FixedRateTaskDescriptor) tasks.getFixedRate().get(0);
167+
assertThat(description.getInitialDelay()).isEqualTo(0);
168+
assertThat(description.getInterval()).isEqualTo(2000);
169+
assertThat(description.getRunnable().getTarget()).isEqualTo(FixedRateTriggerRunnable.class.getName());
170+
});
171+
}
172+
145173
@Test
146174
void taskWithCustomTriggerIsReported() {
147175
run(CustomTriggerTask.class, (tasks) -> {
@@ -223,6 +251,16 @@ public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
223251

224252
}
225253

254+
static class NoInitialDelayFixedDelayTriggerTask implements SchedulingConfigurer {
255+
256+
@Override
257+
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
258+
PeriodicTrigger trigger = new PeriodicTrigger(Duration.ofSeconds(1));
259+
taskRegistrar.addTriggerTask(new FixedDelayTriggerRunnable(), trigger);
260+
}
261+
262+
}
263+
226264
static class FixedRateTriggerTask implements SchedulingConfigurer {
227265

228266
@Override
@@ -235,6 +273,17 @@ public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
235273

236274
}
237275

276+
static class NoInitialDelayFixedRateTriggerTask implements SchedulingConfigurer {
277+
278+
@Override
279+
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
280+
PeriodicTrigger trigger = new PeriodicTrigger(Duration.ofSeconds(2));
281+
trigger.setFixedRate(true);
282+
taskRegistrar.addTriggerTask(new FixedRateTriggerRunnable(), trigger);
283+
}
284+
285+
}
286+
238287
static class CronTriggerTask implements SchedulingConfigurer {
239288

240289
@Override

0 commit comments

Comments
 (0)