原生镜像支持
从 6.0 版本开始,GraalVM 编译 Spring Integration 应用程序到原生镜像,可以通过 Spring AOT 原生提示来实现。对于大多数常见用例,例如使用 @Bean
方法的端点定义、使用 lambda 表达式和 @MessagingGateway
接口扫描(导入)的 Java DSL 配置,框架提供了相应的反射、代理和序列化提示。如果配置在 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 开发原生集成应用程序,并使用其相应的构建工具。 |