SpringApplicationAdminMXBeanRegistrarTests Class — spring-boot Architecture
Architecture documentation for the SpringApplicationAdminMXBeanRegistrarTests class in SpringApplicationAdminMXBeanRegistrarTests.java from the spring-boot codebase.
Entity Profile
Relationship Graph
Source Code
core/spring-boot/src/test/java/org/springframework/boot/admin/SpringApplicationAdminMXBeanRegistrarTests.java lines 52–204
class SpringApplicationAdminMXBeanRegistrarTests {
private static final String OBJECT_NAME = "org.springframework.boot:type=Test,name=SpringApplication";
private MBeanServer mBeanServer;
private @Nullable ConfigurableApplicationContext context;
@BeforeEach
void setup() {
this.mBeanServer = ManagementFactory.getPlatformMBeanServer();
}
@AfterEach
void closeContext() {
if (this.context != null) {
this.context.close();
}
}
@Test
void validateReadyFlag() {
final ObjectName objectName = createObjectName(OBJECT_NAME);
SpringApplication application = new SpringApplication(Config.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.addListeners((ContextRefreshedEvent event) -> {
try {
assertThat(isApplicationReady(objectName)).isFalse();
}
catch (Exception ex) {
throw new IllegalStateException("Could not contact spring application admin bean", ex);
}
});
this.context = application.run();
assertThat(isApplicationReady(objectName)).isTrue();
}
@Test
void eventsFromOtherContextsAreIgnored() throws MalformedObjectNameException {
SpringApplicationAdminMXBeanRegistrar registrar = new SpringApplicationAdminMXBeanRegistrar(OBJECT_NAME);
ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
registrar.setApplicationContext(context);
registrar.onApplicationReadyEvent(new ApplicationReadyEvent(new SpringApplication(), new String[0],
mock(ConfigurableApplicationContext.class), null));
assertThat(isApplicationReady(registrar)).isFalse();
registrar
.onApplicationReadyEvent(new ApplicationReadyEvent(new SpringApplication(), new String[0], context, null));
assertThat(isApplicationReady(registrar)).isTrue();
}
private boolean isApplicationReady(SpringApplicationAdminMXBeanRegistrar registrar) {
Object field = ReflectionTestUtils.getField(registrar, "ready");
assertThat(field).isNotNull();
return (Boolean) field;
}
@Test
void environmentIsExposed() {
final ObjectName objectName = createObjectName(OBJECT_NAME);
SpringApplication application = new SpringApplication(Config.class);
application.setWebApplicationType(WebApplicationType.NONE);
this.context = application.run("--foo.bar=blam");
assertThat(isApplicationReady(objectName)).isTrue();
assertThat(isApplicationEmbeddedWebApplication(objectName)).isFalse();
assertThat(getProperty(objectName, "foo.bar")).isEqualTo("blam");
assertThat(getProperty(objectName, "does.not.exist.test")).isNull();
}
@Test
void whenEnvironmentContainsServerPortsPropertySourceEmbeddedWebApplicationIsDetected() {
final ObjectName objectName = createObjectName(OBJECT_NAME);
SpringApplication application = new SpringApplication(Config.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.addInitializers((context) -> context.getEnvironment()
.getPropertySources()
.addLast(new MapPropertySource("server.ports", Map.of("local.server.port", "8910"))));
this.context = application.run("--foo.bar=blam");
assertThat(isApplicationReady(objectName)).isTrue();
assertThat(isApplicationEmbeddedWebApplication(objectName)).isTrue();
}
@Test
void shutdownApp() {
final ObjectName objectName = createObjectName(OBJECT_NAME);
SpringApplication application = new SpringApplication(Config.class);
application.setWebApplicationType(WebApplicationType.NONE);
this.context = application.run();
assertThat(this.context.isRunning()).isTrue();
invokeShutdown(objectName);
assertThat(this.context.isRunning()).isFalse();
// JMX cleanup
assertThatExceptionOfType(InstanceNotFoundException.class)
.isThrownBy(() -> this.mBeanServer.getObjectInstance(objectName));
}
private Boolean isApplicationReady(ObjectName objectName) {
return getAttribute(objectName, Boolean.class, "Ready");
}
private Boolean isApplicationEmbeddedWebApplication(ObjectName objectName) {
return getAttribute(objectName, Boolean.class, "EmbeddedWebApplication");
}
private String getProperty(ObjectName objectName, String key) {
try {
return (String) this.mBeanServer.invoke(objectName, "getProperty", new Object[] { key },
new String[] { String.class.getName() });
}
catch (Exception ex) {
throw new IllegalStateException(ex.getMessage(), ex);
}
}
private <T> T getAttribute(ObjectName objectName, Class<T> type, String attribute) {
try {
Object value = this.mBeanServer.getAttribute(objectName, attribute);
assertThat(value == null || type.isInstance(value)).isTrue();
return type.cast(value);
}
catch (Exception ex) {
throw new IllegalStateException(ex.getMessage(), ex);
}
}
private void invokeShutdown(ObjectName objectName) {
try {
this.mBeanServer.invoke(objectName, "shutdown", null, null);
}
catch (Exception ex) {
throw new IllegalStateException(ex.getMessage(), ex);
}
}
private ObjectName createObjectName(String jmxName) {
try {
return new ObjectName(jmxName);
}
catch (MalformedObjectNameException ex) {
throw new IllegalStateException("Invalid jmx name " + jmxName, ex);
}
}
@Configuration(proxyBeanMethods = false)
static class Config {
@Bean
SpringApplicationAdminMXBeanRegistrar springApplicationAdminRegistrar() throws MalformedObjectNameException {
return new SpringApplicationAdminMXBeanRegistrar(OBJECT_NAME);
}
}
}
Domain
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free