106. Function 目录和灵活功能签名

Spring Cloud Function 的主要功能之一是适应和支持 user-defined 函数的一系列类型签名。因此,用户可以提供Function<String,String>类型的 bean,FunctionCatalog将其包装为Function<Flux<String>,Flux<String>>。用户通常不必关心FunctionCatalog,但知道 user code 支持哪种函数很有用。

一般来说,如果用户为普通的旧 Java 类型(或原始 wrapper)编写 function,那么 function 目录会将其包装为相同类型的Flux。如果用户使用Message(来自 spring-messaging)编写 function,它将从任何支持 key-value 元数据的适配器(e.g. HTTP headers)接收和发送 headers。这是详细信息。

用户功能目录注册
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 return 类型,这意味着阻塞,至少可能。很可能你不需要写Consumer<Flux<?>>,但如果你确实需要这样做,记得订阅输入通量。如果您声明非发布者类型的Consumer(这是正常的),它将被转换为返回发布者的 function,以便可以以受控方式订阅它。

function 目录可以包含具有相同 name 的SupplierFunction(或Consumer)(如同一资源的 GET 和 POST)。它甚至可以包含与Function具有相同 name 的Consumer<Flux<>>,但是当T不是Publisher时它不能包含具有相同 name 的Consumer<T>Function<T,S>,因为 consumer 将被转换为Function并且只能注册其中一个__ 。