From 8c9662a45e3e6fe5c8f1e8d11302bc11fc7f7b8b Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Thu, 1 Sep 2022 15:56:34 -0400 Subject: [PATCH] Expose more AOT hints * Add `@Reflective` to methods of `Pausable` and `ManageableLifecycle` to give them access from Control Bus which uses SpEL invocation engine - reflection, essentially * Add proxy hint for the `RequestReplyExchanger`, which is used for `gateway()` definition in Java DSL --- .../springframework/integration/aot/CoreRuntimeHints.java | 8 +++----- .../org/springframework/integration/core/Pausable.java | 6 ++++++ .../support/management/ManageableLifecycle.java | 6 ++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/aot/CoreRuntimeHints.java b/spring-integration-core/src/main/java/org/springframework/integration/aot/CoreRuntimeHints.java index 720acb5b63..0005cd073a 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/aot/CoreRuntimeHints.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/aot/CoreRuntimeHints.java @@ -40,9 +40,9 @@ import org.springframework.context.SmartLifecycle; import org.springframework.core.DecoratingProxy; import org.springframework.integration.context.IntegrationContextUtils; import org.springframework.integration.core.GenericSelector; -import org.springframework.integration.core.Pausable; import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.integration.gateway.MethodArgsHolder; +import org.springframework.integration.gateway.RequestReplyExchanger; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.handler.DelayHandler; import org.springframework.integration.handler.GenericHandler; @@ -55,7 +55,6 @@ import org.springframework.integration.store.MessageHolder; import org.springframework.integration.store.MessageMetadata; import org.springframework.integration.support.MutableMessage; import org.springframework.integration.support.MutableMessageHeaders; -import org.springframework.integration.support.management.ManageableSmartLifecycle; import org.springframework.integration.transformer.GenericTransformer; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.support.ErrorMessage; @@ -83,9 +82,7 @@ class CoreRuntimeHints implements RuntimeHintsRegistrar { IntegrationContextUtils.class, MethodArgsHolder.class, AbstractReplyProducingMessageHandler.RequestHandler.class, - ExpressionEvaluatingRoutingSlipRouteStrategy.RequestAndReply.class, - Pausable.class, - ManageableSmartLifecycle.class) + ExpressionEvaluatingRoutingSlipRouteStrategy.RequestAndReply.class) .forEach(type -> reflectionHints.registerType(type, builder -> builder.withMembers(MemberCategory.INVOKE_PUBLIC_METHODS))); @@ -137,6 +134,7 @@ class CoreRuntimeHints implements RuntimeHintsRegistrar { ProxyHints proxyHints = hints.proxies(); + registerSpringJdkProxy(proxyHints, RequestReplyExchanger.class); registerSpringJdkProxy(proxyHints, AbstractReplyProducingMessageHandler.RequestHandler.class); registerSpringJdkProxy(proxyHints, IntegrationFlow.class, SmartLifecycle.class); } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/core/Pausable.java b/spring-integration-core/src/main/java/org/springframework/integration/core/Pausable.java index 4cbd24a23a..68d6b685c7 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/core/Pausable.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/core/Pausable.java @@ -16,6 +16,7 @@ package org.springframework.integration.core; +import org.springframework.aot.hint.annotation.Reflective; import org.springframework.integration.support.management.ManageableLifecycle; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; @@ -26,6 +27,8 @@ import org.springframework.jmx.export.annotation.ManagedOperation; * messages. * * @author Gary Russell + * @author Artem Bilan + * * @since 5.0.3 * */ @@ -35,12 +38,14 @@ public interface Pausable extends ManageableLifecycle { * Pause the endpoint. */ @ManagedOperation(description = "Pause the component") + @Reflective void pause(); /** * Resume the endpoint if paused. */ @ManagedOperation(description = "Resume the component") + @Reflective void resume(); /** @@ -49,6 +54,7 @@ public interface Pausable extends ManageableLifecycle { * @since 5.4 */ @ManagedAttribute(description = "Is the component paused?") + @Reflective default boolean isPaused() { throw new UnsupportedOperationException("This component does not implement this method"); } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/management/ManageableLifecycle.java b/spring-integration-core/src/main/java/org/springframework/integration/support/management/ManageableLifecycle.java index ddfa8b76b2..2690f3bf68 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/management/ManageableLifecycle.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/management/ManageableLifecycle.java @@ -16,6 +16,7 @@ package org.springframework.integration.support.management; +import org.springframework.aot.hint.annotation.Reflective; import org.springframework.context.Lifecycle; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; @@ -24,20 +25,25 @@ import org.springframework.jmx.export.annotation.ManagedOperation; * Makes {@link Lifecycle} methods manageable. * * @author Gary Russell + * @author Artem Bilan + * * @since 5.4 * */ public interface ManageableLifecycle extends Lifecycle { @ManagedOperation(description = "Start the component") + @Reflective @Override void start(); @ManagedOperation(description = "Stop the component") + @Reflective @Override void stop(); @ManagedAttribute(description = "Is the component running?") + @Reflective @Override boolean isRunning();