此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 spring-cloud-stream 4.1.4spring-doc.cn

后处理(发送消息后)

调用函数后,框架会将其结果发送到目标目标,从而有效地完成函数调用周期。spring-doc.cn

但是,从业务角度来看,此类周期可能无法完全完成,直到在此周期完成后执行一些其他任务。 虽然这可以通过 和 的简单组合来实现,如这篇 Stack Overflow 博文中所述,但从版本 4.0.3 开始,框架 通过 Spring Cloud Function 项目提供了一种更惯用的方法来解决此问题。 这是一个特殊的半标记函数,其中包含一种设计的附加方法 为实现此类后处理任务提供位置。ConsumerStreamBridgePostProcessingFunctionPostProcessingFunctionpostProcess(Message>)spring-doc.cn

package org.springframework.cloud.function.context
. . .
public interface PostProcessingFunction<I, O> extends Function<I, O> {
	default void postProcess(Message<O> result) {
	}
}

所以,现在你有两个选择。spring-doc.cn

选项 1:您可以实现您的函数,也可以通过实现其方法来包含其他后处理行为。PostProcessingFunctionpostProcess(Message>)spring-doc.cn

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>)spring-doc.cn

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`

注意: 在函数组合的情况下,只有 的最后一个实例(如果存在)才会生效。例如,假设您有 以下函数定义 - 和 都是 .Only 将被调用。 如果 不是 的实例,则不会执行任何后处理功能。PostProcessingFunctionfoo|bar|bazfoobazPostProcessingFunctionbaz.postProcess(Message>)bazPostProcessingFunctionspring-doc.cn

有人可能会争辩说,你可以很容易地通过函数组合来做到这一点,只需将一个后处理器组合成另一个 .然而,这确实是一种可能性 在这种情况下,将在调用前一个函数之后和将消息发送到目标目标之前立即调用 Post Processing 功能 即在函数调用周期完成之前。Functionspring-doc.cn