Starting with version 6.0, GraalVM compilation of Spring Integration applications to native images is supported by Spring AOT native hints.
For most common use cases, such as endpoint definitions with @Bean
methods, Java DSL configuration with lambdas and @MessagingGateway
interface scanning (importing), the framework provides respective reflection, proxy and serialization hints.
If configuration uses messaging annotations (@ServiceActivator
, @Splitter
etc.) on POJO methods, or POJO methods are used with the IntegrationFlowBuilder.handle(Object service, String methodName)
API, they have to be also marked with a @Reflective
annotation since they are invoked by the framework reflectively.
XML configuration is not supported for native images. |
XML configuration is not supported for native images. |
As stated before, service interfaces with the @MessagingGateway
annotation, when they are scanned by the @IntegrationComponentScan
or used in an @Import
annotation, are processed by the framework and the respective proxy hint is exposed into the AOT contribution.
When gateways are declared using the IntegrationFlow.from(Class<?> serviceInterface)
API, the proxy configured for such interfaces have to be exposed manually:
@Configuration
@EnableIntegration
@ImportRuntimeHints(GatewayRuntimeHints.class)
public class IntegrationConfiguration {
@Bean
IntegrationFlow someFlow() {
return IntegrationFlow.from(SomeGateway)
// ...
.get();
}
public interface SomeGateway {
void doSomething(Object payload);
}
private static class GatewayRuntimeHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
hints.proxies().registerJdkProxy(
AopProxyUtils.completeJdkProxyInterfaces(SomeGateway));
}
}
}
The IntegrationFlow content is not processed during the AOT processing phase.
Therefore, some hints, such as the one mentioned above for a gateway proxy, must be provided by the target application.
|
The IntegrationFlow content is not processed during the AOT processing phase.
Therefore, some hints, such as the one mentioned above for a gateway proxy, must be provided by the target application.
|
Of course, configuration is just a piece of an integration solution.
The most important part is data transferring over the network as well as persistent storage.
That’s where serialization comes handy for many use-cases.
Spring Integration exposes serialization hints into a native image configuration for these types used by the framework internally: String
, Number
, Long
, Date
, ArrayList
, HashMap
, Properties
, Hashtable
, Exception
, UUID
, GenericMessage
, ErrorMessage
, MessageHeaders
, AdviceMessage
, MutableMessage
, MutableMessageHeaders
, MessageGroupMetadata
, MessageHolder
, MessageMetadata
, MessageHistory
, MessageHistory.Entry
, DelayHandler.DelayedMessageWrapper
.
For user specific data, mostly present as a message payload, the serialization hint must be exposed manually via a RuntimeHintsRegistrar
implementation, as is shown above for a gateway proxy, and the respective RuntimeHints.serialization().registerType()
API.
It is recommended that native integration applications are developed with Spring Boot, using its respective build tools. |
It is recommended that native integration applications are developed with Spring Boot, using its respective build tools. |