此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 spring-cloud-stream 4.1.4! |
后处理(发送消息后)
调用函数后,框架会将其结果发送到目标目标,从而有效地完成函数调用周期。
但是,从业务角度来看,此类周期可能无法完全完成,直到在此周期完成后执行一些其他任务。
虽然这可以通过简单的Consumer
和StreamBridge
如这篇 Stack Overflow 博文中所述,从版本 4.0.3 开始,框架
提供了一种更惯用的方法来解决此问题,方法是PostProcessingFunction
由 Spring Cloud Function 项目提供。
这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,你可以简单地只实现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
.然而,这确实是一种可能性
在这种情况下,将在调用前一个函数之后和将消息发送到目标目标之前立即调用 Post Processing 功能
即在函数调用周期完成之前。