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