在Spring Cloud Stream 3.1中@EnableBinding已经被做了@deprecated的标注。那我们原有的程序如何适应新版本呢,确实Spring Cloud Stream在这方面做了很大的改进。
Spring现在不再使用基于注释的配置,而是使用检测到的Consumer / Function / Supplier的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());
}
}
}
}
Consumer替代了@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
输入和输出对应于绑定的类型(例如input或output)。 索引是输入或输出绑定的索引。 对于典型的单个输入/输出功能,它始终为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" }
}
}