Skip to content

Commit e7fd7a5

Browse files
author
Johannes Stelzer
committed
Execute registration on startup asynchronously to not block startup
1 parent 0bd7eee commit e7fd7a5

File tree

2 files changed

+39
-28
lines changed

2 files changed

+39
-28
lines changed

spring-boot-admin-starter-client/src/main/java/de/codecentric/boot/admin/services/RegistrationApplicationListener.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,39 @@
99
import org.springframework.context.event.ContextRefreshedEvent;
1010
import org.springframework.core.Ordered;
1111
import org.springframework.core.annotation.Order;
12+
import org.springframework.core.task.SimpleAsyncTaskExecutor;
13+
import org.springframework.core.task.TaskExecutor;
1214

1315
import de.codecentric.boot.admin.config.AdminProperties;
1416

1517
@Order(Ordered.LOWEST_PRECEDENCE)
16-
public class RegistrationApplicationListener implements
17-
ApplicationListener<ApplicationEvent> {
18+
public class RegistrationApplicationListener implements ApplicationListener<ApplicationEvent> {
1819
private final AdminProperties admin;
1920
private final ApplicationRegistrator registrator;
21+
private final TaskExecutor executor;
2022

2123
public RegistrationApplicationListener(AdminProperties admin,
22-
ApplicationRegistrator registrator) {
24+
ApplicationRegistrator registrator, TaskExecutor executor) {
2325
this.admin = admin;
2426
this.registrator = registrator;
27+
this.executor = executor;
2528
}
2629

30+
public RegistrationApplicationListener(AdminProperties admin,
31+
ApplicationRegistrator registrator) {
32+
this(admin, registrator, new SimpleAsyncTaskExecutor());
33+
}
34+
35+
@Override
2736
public void onApplicationEvent(ApplicationEvent event) {
2837
if (startedDeployedWar(event) || startedEmbeddedServer(event)) {
29-
registrator.register();
30-
}
31-
else if (admin.isAutoDeregistration()
32-
&& event instanceof ContextClosedEvent) {
38+
executor.execute(new Runnable() {
39+
@Override
40+
public void run() {
41+
registrator.register();
42+
}
43+
});
44+
} else if (admin.isAutoDeregistration() && event instanceof ContextClosedEvent) {
3345
registrator.deregister();
3446
}
3547
}
@@ -50,4 +62,3 @@ private boolean startedDeployedWar(ApplicationEvent event) {
5062
return false;
5163
}
5264
}
53-

spring-boot-admin-starter-client/src/test/java/de/codecentric/boot/admin/services/RegistrationApplicationListenerTest.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext;
1313
import org.springframework.context.event.ContextClosedEvent;
1414
import org.springframework.context.event.ContextRefreshedEvent;
15+
import org.springframework.core.task.SyncTaskExecutor;
1516

1617
import de.codecentric.boot.admin.config.AdminProperties;
1718

@@ -27,37 +28,36 @@ public void setup() {
2728
@Test
2829
public void test_register_embedded() {
2930
ApplicationRegistrator registrator = mock(ApplicationRegistrator.class);
30-
RegistrationApplicationListener listener = new RegistrationApplicationListener(
31-
admin, registrator);
31+
RegistrationApplicationListener listener = new RegistrationApplicationListener(admin,
32+
registrator, new SyncTaskExecutor());
3233

3334
listener.onApplicationEvent(new EmbeddedServletContainerInitializedEvent(
34-
mock(EmbeddedWebApplicationContext.class),
35-
mock(EmbeddedServletContainer.class)));
35+
mock(EmbeddedWebApplicationContext.class), mock(EmbeddedServletContainer.class)));
3636

3737
verify(registrator).register();
3838
}
3939

4040
@Test
4141
public void test_register_war() {
4242
ApplicationRegistrator registrator = mock(ApplicationRegistrator.class);
43-
RegistrationApplicationListener listener = new RegistrationApplicationListener(
44-
admin, registrator);
43+
RegistrationApplicationListener listener = new RegistrationApplicationListener(admin,
44+
registrator, new SyncTaskExecutor());
4545

46-
listener.onApplicationEvent(new ContextRefreshedEvent(
47-
mock(EmbeddedWebApplicationContext.class)));
46+
listener.onApplicationEvent(
47+
new ContextRefreshedEvent(mock(EmbeddedWebApplicationContext.class)));
4848

4949
verify(registrator).register();
5050
}
5151

5252
@Test
5353
public void test_no_register_war() {
5454
ApplicationRegistrator registrator = mock(ApplicationRegistrator.class);
55-
RegistrationApplicationListener listener = new RegistrationApplicationListener(
56-
admin, registrator);
55+
RegistrationApplicationListener listener = new RegistrationApplicationListener(admin,
56+
registrator, new SyncTaskExecutor());
5757

5858
EmbeddedWebApplicationContext context = mock(EmbeddedWebApplicationContext.class);
59-
when(context.getEmbeddedServletContainer()).thenReturn(
60-
mock(EmbeddedServletContainer.class));
59+
when(context.getEmbeddedServletContainer())
60+
.thenReturn(mock(EmbeddedServletContainer.class));
6161
listener.onApplicationEvent(new ContextRefreshedEvent(context));
6262

6363
verify(registrator, never()).register();
@@ -66,25 +66,25 @@ public void test_no_register_war() {
6666
@Test
6767
public void test_no_deregister() {
6868
ApplicationRegistrator registrator = mock(ApplicationRegistrator.class);
69-
RegistrationApplicationListener listener = new RegistrationApplicationListener(
70-
admin, registrator);
69+
RegistrationApplicationListener listener = new RegistrationApplicationListener(admin,
70+
registrator, new SyncTaskExecutor());
7171

72-
listener.onApplicationEvent(new ContextClosedEvent(
73-
mock(EmbeddedWebApplicationContext.class)));
72+
listener.onApplicationEvent(
73+
new ContextClosedEvent(mock(EmbeddedWebApplicationContext.class)));
7474

7575
verify(registrator, never()).deregister();
7676
}
7777

7878
@Test
7979
public void test_deregister() {
8080
ApplicationRegistrator registrator = mock(ApplicationRegistrator.class);
81-
RegistrationApplicationListener listener = new RegistrationApplicationListener(
82-
admin, registrator);
81+
RegistrationApplicationListener listener = new RegistrationApplicationListener(admin,
82+
registrator);
8383

8484
admin.setAutoDeregistration(true);
8585

86-
listener.onApplicationEvent(new ContextClosedEvent(
87-
mock(EmbeddedWebApplicationContext.class)));
86+
listener.onApplicationEvent(
87+
new ContextClosedEvent(mock(EmbeddedWebApplicationContext.class)));
8888

8989
verify(registrator).deregister();
9090
}

0 commit comments

Comments
 (0)