我看到 Spring Cloud Stream 的以下注释已折旧
@Input
@Output
@EnableBinding
@StreamListener
请提供示例和文档链接,了解如何以功能方式进行操作。
答案 0 :(得分:4)
Spring 现在不再使用基于注解的配置,而是使用检测到的消费者/功能/供应商 bean 来为您定义流。 旧版本带有注释的代码如下所示:
interface InputChannels {
@Input("input")
SubscribableChannel input();
}
@EnableBinding(InputChannels.class)
public class PubSubDemo {
@StreamListener("input")
public void listen() {
if (LOG.isInfoEnabled()) {
LOG.info(context.toString());
}
}
新版本代码如下:
public class PubSubDemo {
@Bean
Consumer<String> input() {
return str -> {
if (LOG.isInfoEnabled()) {
LOG.info(context.toString());
}
};
}
}
Check Consumer bean 替换了 @StreamListener 和 @Input。
关于配置,如果之前为了配置你有一个 application.yml 看起来像这样:
spring:
cloud:
stream:
bindings:
input:
destination: destination
group: group
consumer:
concurrency: 10
max-attempts: 3
现在新的配置会像
spring:
cloud:
stream:
bindings:
input-in-0:
destination: destination
group: group
consumer:
concurrency: 10
max-attempts: 3
in 和 out 对应绑定的类型(例如输入或输出)。索引是输入或输出绑定的索引。对于典型的单输入/输出功能,它始终为 0。
现在让我们考虑输出渠道:
public interface OutputChannels {
@Output
MessageChannel output();
}
@Service
@EnableBinding(OutputChannels.class)
class PubSubSendQueue {
OutputChannels outputChannel;
public void publish() {
outputChannel.output().send("Hello");
}
}
现在函数代码如下:
@Service
class PubSubSendQueue {
@Bean
public Supplier<String> output(){
return Supplier { "Adam" }
}
}
答案 1 :(得分:2)
这个github仓库包含了很多例子..
https://github.com/spring-cloud/stream-applications
官方文档详细解释了如何在带有 kafka 流的 Spring Cloud 流应用程序中从命令式风格转变为函数式风格,但没有它也一样。
请同时查看此帖子..
https://spring.io/blog/2019/10/14/spring-cloud-stream-demystified-and-simplified
有一个命令式代码示例 (https://docs.spring.io/spring-cloud-stream-binder-kafka/docs/3.1.0/reference/html/spring-cloud-stream-binder-kafka.html#_imperative_programming_model) 以及如何使用函数式风格开发它。