Native Images 支持
从 6.0 版本开始,Spring Integration 应用程序编译为 GraalVM 原生镜像的功能得到了 Spring AOT 原生提示的支持。对于大多数常见用例,例如使用 @Bean 方法定义端点、使用 lambda 的 Java DSL 配置以及 @MessagingGateway 接口扫描(导入),框架提供了相应的反射、代理和序列化提示。如果配置在 POJO 方法上使用了消息传递注解(@ServiceActivator、@Splitter 等),或者 POJO 方法与 IntegrationFlowBuilder.handle(Object service, String methodName) API 一起使用,则它们也必须用 @Reflective 注解进行标记,因为它们是通过反射方式由框架调用的。
原生镜像不支持 XML 配置。
如前所述,带有 @MessagingGateway 注解的服务接口,当它们被 @IntegrationComponentScan 扫描或在 @Import 注解中使用时,会由框架处理,并且相应的代理提示会暴露给 AOT 贡献。当使用 IntegrationFlow.from(Class<?> serviceInterface) API 声明网关时,为这些接口配置的代理必须手动暴露:
@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));
}
}
}
IntegrationFlow 的内容在 AOT 处理阶段不会被处理。因此,某些提示(例如上述网关代理的提示)必须由目标应用程序提供。
当然,配置只是集成解决方案的一部分。最重要的部分是通过网络传输数据以及持久化存储。这正是序列化在许多使用场景中发挥作用的地方。Spring Integration 为框架内部使用的这些类型暴露了序列化提示到原生镜像配置中:String、Number、Long、Date、ArrayList、HashMap、Properties、Hashtable、Exception、UUID、GenericMessage、ErrorMessage、MessageHeaders、AdviceMessage、MutableMessage、MutableMessageHeaders、MessageGroupMetadata、MessageHolder、MessageMetadata、MessageHistory、MessageHistory.Entry、DelayHandler.DelayedMessageWrapper。对于用户特定的数据(通常作为消息负载存在),必须通过 RuntimeHintsRegistrar 实现手动暴露序列化提示,如上文网关代理所示,并使用相应的 RuntimeHints.serialization().registerType() API。
建议使用 Spring Boot 及其相应的构建工具来开发原生集成应用。