最后
Binder可以生成Binding,Binding用来绑定消息容器的生产者和消费者,它有两种类型,INPUT和OUTPUT,INPUT对应于消费者,OUTPUT对应于生产者。
POM
主要增加了 org.springframework.cloud:spring-cloud-starter-stream-rocketmq 依赖,
老顾采用最新Spring Boot的2.1.8.RELEASE版本,SpringCloud的Greenwich.SR2版本;Spring-Cloud-Alibaba的2.1.0.RELEASE版本。
增加依赖
EnableBinding配置
我们需要通过在配置类上使用@EnableBinding指定需要使用的Binding,它指定的是一个接口,在对应接口中会定义一些标注了@Input或@Output的方法,它们就对应一个Binding了。
@Output注解对应的是org.springframework.messaging.MessageChannel,代表发布者
@Input注解对应的是org.springframework.messaging.SubscribableChannel,代表消费者
Source内置接口
org.springframework.cloud.stream.messaging.Source是内置的Output接口
小伙伴们也可以不用内置的,模仿Source自行定义就行了
它定义了一个OUTPUT类型的Binding,名称为output,当不通过@Output指定Binding的名称时,默认会使用方法名作为Binding的名称。
Sink内置接口
Sink的定义如下,它定义了一个INPUT类型的Binding,名称为input,当不通过@Input指定Binding的名称时,默认会使用方法名作为Binding的名称。
在一个接口中可以同时定义多个Binding,只需要定义多个@Input或@Output标注的方法。Processor接口同时继承了Source和Sink接口,所以当@EnableBinding指定了Processor接口时相当于同时应用了两个Binding。
public interface Processor extends Source, Sink {
}
@EnableBinding({ Processor.class })
生产者
我们来定义一个output类型的Binding
在上面代码中我们指定了@EnableBinding接口为Source接口,即启用了名称为output的OUTPUT类型的Binding。Spring Cloud会自动实现该Binding的实现,也会提供Binding接口的实现,并注册到bean容器中。即可以在程序中自动注入Source类型的bean,也可以注入MessageChannel类型的bean。
上面定义了一个生产发布服务,直接注入Source类型的bean,然后通过Source的output()获取MessageChannel实例,通过它的send()方法进行消息发送。
另一种使用方式,就是直接获取MessageChannel,如下代码,效果是一样的。
那发送的消息究竟会发送到哪里呢?这就需要我们来定义对应的Binding和实际消息容器的生产者的映射了。可以通过spring.cloud.stream.bindings..*的形式定义Binding的一些属性。
具体有什么属性可查看org.springframework.cloud.stream.config.BindingProperties
这里我们通过其destination属性指定该Binding对应的实际的目的地,对应于RocketMQ就是一个Topic。
spring.cloud.stream.bindings.output.destination=test-topic
即我们上面发送的消息将发到RocketMQ的名为test-topic的Topic。
RocketMQ是需要指定NameServer的,所以在发送消息前,还需要基于RocketMQ这个Binder配置其NameServer的地址。
spring.cloud.stream.rocketmq.binder.namesrv-addr=192.168.31.153:9876
在启动了RocketMQ的NameServer和Broker之后,就可以利用上面的代码进行消息发送了。测试代码如下。
在测试的时候可以在启动RocketMQ时指定autoCreateTopicEnable=true以开启自动创建Topic的功能,如mqbroker -n localhost:9876 autoCreateTopicEnable=true。
继承CommandLineRunner接口,启动就会执行run方法,就是调用ProviderService发送消息。到Rocketmq控制台查看消息
消费者
消费者接收消息和生产者类似,也需要定义相应的Binding,也需要通过@EnableBinding进行指定。Spring Cloud的Sink接口中已经定义好一个名为input的Binding,如果只需要一个接收Binding,可以直接拿来用。
学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,读者朋友可以转发分享下!
Java核心知识体系笔记.pdf
中高级Java开发面试高频考点题笔记300道.pdf
架构进阶面试专题及架构学习笔记脑图
Java架构进阶学习视频分享
ps://bbs.csdn.net/topics/618154847)收录**