一旦函数被调用,其结果就会被框架发送到目标目的地,从而有效地完成函数调用周期。
但是,从业务角度来看,在完成此周期后执行一些附加任务之前,此类循环可能不会完全完成。
虽然这可以通过简单的组合来实现,但正如这篇 Stack Overflow 帖子中所描述的那样,从 4.0.3 版开始,框架
通过Spring Cloud Function项目提供了一种更惯用的方法来解决这个问题。
这是一种特殊的半标记功能,其中包含一种附加设计的方法
为实施此类后处理任务提供场所。Consumer
StreamBridge
PostProcessingFunction
PostProcessingFunction
postProcess(Message>)
package org.springframework.cloud.function.context . . . public interface PostProcessingFunction<I, O> extends Function<I, O> { default void postProcess(Message<O> result) { } }
所以,现在你有两个选择。
选项 1:您可以通过实现其方法实现函数,并包含其他后处理行为。PostProcessingFunction
postProcess(Message>)
private static class Uppercase implements PostProcessingFunction<String, String> { @Override public String apply(String input) { return input.toUpperCase(); } @Override public void postProcess(Message<String> result) { System.out.println("Function Uppercase has been successfully invoked and its result successfully sent to target destination"); } } . . . @Bean public Function<String, String> uppercase() { return new Uppercase(); }
选项 2:如果您已经有一个现有函数,并且不想更改其实现或希望将函数保留为 POJO,则只需实现 method 并将这个新的后处理函数与其他函数组合在一起。postProcess(Message>)
private static class Logger implements PostProcessingFunction<?, String> { @Override public void postProcess(Message<String> result) { System.out.println("Function has been successfully invoked and its result successfully sent to target destination"); } } . . . @Bean public Function<String, String> uppercase() { return v -> v.toUpperCase(); } @Bean public Function<String, String> logger() { return new Logger(); } . . . // and then have your function definition as such `uppercase|logger`
注意:
在函数组合的情况下,只有最后一个实例(如果存在)才会生效。例如,假设您有
以下函数定义 - 并且 和 都是 的实例。只会被调用。
如果不是 的实例,则不会执行后处理功能。PostProcessingFunction
foo|bar|baz
foo
baz
PostProcessingFunction
baz.postProcess(Message>)
baz
PostProcessingFunction
有人可能会争辩说,您可以通过简单地将一个后处理器组合成另一个后处理器来轻松通过函数组合来做到这一点。然而,这确实是一种可能性
在这种情况下,后处理功能将在调用前一个函数之后和消息发送到目标目标之前立即调用
这是在函数调用周期完成之前。Function