127. 功能目录和灵活的功能签名
Spring Cloud Function 的主要功能之一是为用户定义的函数适应和支持各种类型签名,同时提供一致的执行模型。这就是为什么使用Project Reactor定义的 Primitives(即Flux<T>
和Mono<T>
)将所有用户定义的函数通过FunctionCatalog
转换为规范表示的原因。例如,用户可以提供类型为Function<String,String>
的 bean,而FunctionCatalog
会将其包装为Function<Flux<String>,Flux<String>>
。
使用基于 Reactor 的 Primitives 不仅有助于用户定义函数的规范表示,而且还有助于构建更健壮和灵活的(Reactive)执行模型。
尽管用户通常根本不需要关心FunctionCatalog
,但了解用户代码支持哪些功能很有用。
127.1 Java 8 功能支持
一般而言,用户可以期望,如果他们为普通的旧 Java 类型(或原始包装器)编写函数,则函数目录会将其包装为相同类型的Flux
。如果用户使用Message
(通过 spring-messaging)编写函数,则它将从支持键值元数据的任何适配器接收和传输 Headers(例如 HTTPHeaders)。这是详细信息。
User Function | Catalog Registration | |
---|---|---|
Function<S,T> | Function<Flux<S>, Flux<T>> | |
Function<Message<S>,Message<T>> | Function<Flux<Message<S>>, Flux<Message<T>>> | |
Function<Flux<S>, Flux<T>> | Function<Flux<S>, Flux<T>> (通过) | |
Supplier<T> | Supplier<Flux<T>> | |
Supplier<Flux<T>> | Supplier<Flux<T>> | |
Consumer<T> | Function<Flux<T>, Mono<Void>> | |
Consumer<Message<T>> | Function<Flux<Message<T>>, Mono<Void>> | |
Consumer<Flux<T>> | Consumer<Flux<T>> |
Consumer 有点特殊,因为它具有void
返回类型,这意味着至少有可能阻塞。最有可能您不需要写Consumer<Flux<?>>
,但是如果确实需要这样做,请记住订阅 Importing 流量。如果声明非发布者类型的Consumer
(这是正常的),它将被转换为返回发布者的函数,以便可以通过受控方式进行订阅。
127.2 Kotlin Lambda 支持
我们还为 Kotlin lambdas(自 v2.0 起)提供支持。考虑以下:
@Bean
open fun kotlinSupplier(): () -> String {
return { "Hello from Kotlin" }
}
@Bean
open fun kotlinFunction(): (String) -> String {
return { it.toUpperCase() }
}
@Bean
open fun kotlinConsumer(): (String) -> Unit {
return { println(it) }
}
上面代表配置为 Spring bean 的 Kotlin lambda。每个签名都 Map 到 Java 等效的Supplier
,Function
和Consumer
,因此框架支持/识别了签名。尽管 Kotlin 到 Java 的 Map 机制不在本文档的讨论范围之内,但重要的是要了解,此处也适用“ Java 8 函数支持”部分中概述的相同的签名转换规则。
要启用 Kotlin 支持,您所需要做的就是将spring-cloud-function-kotlin
模块添加到您的 Classpath 中,其中包含适当的自动配置和支持类。