This post has been featured on This Week in Spring – February 20th, 2018 and I’m feel honored to be referred as “Spring community legend” but even more so to be listed next to a lot of people who’s work I use on a daily basis. Thanks, Josh.
Tim from Ordina posted a nice blog recently, about Visualizing your Spring Integration components & flows. As it happens, I’m currently using Spring Integration as well and find the Integration Graph really useful.
Tim recommends just adding the integretion-http
component, but I cannot do this because the project uses JAX-RS and Jersey.
Here is where the revised Actuator support in Spring Boot 2 really shines: Actuator isn’t depending on a specific technology anymore, like Spring MVC, Jersey or for that matter, Spring WebFlux.
Existing and custom endpoints are technology agnostic and can be written without thinking about Spring MVC or Jersey.
Here’s what you need todo to provide Springs Integration Graph pretty much like @EnableIntegrationGraphController
but without tying yourself to a specific web technology and at the same time, profiting from all the infrastructure behind Actuator:
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.boot.actuate.endpoint.annotation.WriteOperation; import org.springframework.context.annotation.Bean; import org.springframework.integration.support.management.graph.Graph; import org.springframework.integration.support.management.graph.IntegrationGraphServer; /** * Provides insights into the integration graph and flow. * * @author michael@simons.ac */ @ManagementContextConfiguration public class IntegrationGraphEndpointConfig { @Bean public IntegrationGraphServer integrationGraphServer() { return new IntegrationGraphServer(); } @Bean public IntegrationGraphEndpoint integrationGraphEndpoint(final IntegrationGraphServer integrationGraphServer) { return new IntegrationGraphEndpoint(integrationGraphServer); } @Endpoint(id = "integration") static class IntegrationGraphEndpoint { private final IntegrationGraphServer integrationGraphServer; public IntegrationGraphEndpoint(IntegrationGraphServer integrationGraphServer) { this.integrationGraphServer = integrationGraphServer; } @ReadOperation public Graph getGraph() { return this.integrationGraphServer.getGraph(); } @WriteOperation public Graph rebuildAndGetGraph() { return this.integrationGraphServer.rebuild(); } } } |
@ManagementContextConfiguration
is a specialized configuration that only deals with management endpoint config. It creates an instance of IntegrationGraphServer
and passes it on to an IntegrationGraphEndpoint
which is marked as such. The endpoint has a read and a write operation, the later mapping automatically to a POST-request.
Note: You should register your custom endpoint configuration in /META-INF/spring.factories
. The management endpoints can be configured to live in a different Spring context and the specialized configuration may not be part of regular auto configuration. For the example above that would look something like this:
org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration = \ your.package.IntegrationGraphEndpointConfig |
The above endpoint will work only in the same context as the main application, as IntegrationGraphServer
needs access to the application context containing your flows. But I have the impression I’ve successfully nerd-snipped Tim.
And just like that, I can build upon Tims nice D3.js based Spring-Integration getting the data from /actuator/integration
.
This and more is part of the upcoming German Spring Boot Buch.
No comments yet
Post a Comment