后处理(发送消息后)

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

然而,从业务角度来看,这个周期可能还没有完全完成,直到完成完成了一些额外任务。 虽然这可以通过简单的组合实现消费者流桥正如这篇 Stack Overflow 帖子中所述,自 4.0.3 版本起,框架 提供了一种更为专注的方法来解决这个问题,通过以下方式后处理函数由 Spring Cloud Function 项目提供。 这后处理函数是一个特殊的半标记函数,包含一种额外的方法postProcess(Message>)设计 为实现此类后处理任务提供一个平台。spring-doc.cadn.net.cn

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

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

选项1:你可以将函数实现为后处理函数并通过实现其后处理行为,还包含了额外的后处理行为postProcess(Message>)方法。spring-doc.cadn.net.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();
}

选项二:如果你已经有一个函数,不想更改它的实现,或者想保留 POJO 的函数,你可以只实现postProcess(Message>)将这个新的后期处理函数与你的另一个函数一起编写。spring-doc.cadn.net.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`

注意: 在函数复合的情况下,只有最后一个实例后处理函数(如有)将生效。例如,假设你有 函数定义如下 -Foo|bar|baz两者兼具巴兹是 的实例后处理函数.只baz.postProcess(Message>)将被调用。 如果巴兹不是后处理函数那么,就不会执行任何后处理功能。spring-doc.cadn.net.cn

有人可能会认为,你可以通过简单地将一个后期处理器写成另一个,来实现这一点功能.不过这确实是有可能的 此时的后处理功能将在调用前一个函数后、消息发送到目标目的地之前调用 这发生在函数调用周期完成之前。spring-doc.cadn.net.cn