网上有很多关于Spring cloud stream的介绍,这里我就不赘述了。我在学习这个Spring cloud stream时,也是学习着别人的博客,跟着别人的博客搭着Demo,一步步了解这个玩意,但是,作为博客博主,总会漏掉一些博主想当然的东西,觉得不需要赘述的东西,这恰恰是初学者为何有时跟着博客搭个“hello world”级别的demo时却总是碰壁,从而变得暴躁。因此我在这里将我碰到的一些坑,我的解决思路,一一记录下来,希望对同样碰到这些坑的你能够有所帮助。
入门Demo,搭建了两个spring boot 项目,各自实现发布(spring-cloud-stream-binding-output)、订阅(spring-cloud-stream-binding-input)这俩功能,通俗讲就是一个服务发信息,另一个服务接受信息这样子。只不过使用了rabbitmq这个服务器的消息队列进行支持。
首先,第一个项目,创建订阅项目。
新建一个spring boot项目,项目名为:spring-cloud-stream-binding-input
pom.xml文件中主要依赖如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
application.properties文件内容如下:
server.port=8080
spring.cloud.stream.bindings.input.destination=sink-channel
spring.cloud.stream.binders.defaultRabbit.type=rabbit
spring.cloud.stream.binders.defaultRabbit.environment.spring.rabbitmq.host=192.168.25.130
spring.cloud.stream.binders.defaultRabbit.environment.spring.rabbitmq.port=5672
spring.cloud.stream.binders.defaultRabbit.environment.spring.rabbitmq.username=admin
spring.cloud.stream.binders.defaultRabbit.environment.spring.rabbitmq.password=admin
这里需要说明一下的是,关于第三行~第七行,这五行配置的是连接rabbitmq的地址、端口、用户名和密码。这里需要说明的是,如果不配置这些内容也是可以的,只不过他会默认的rabbitmq设置,他会连接localhost下5672端口的rabbitmq服务,账号密码也不知道是什么鬼东西(反正控制台没打)。刚学习的时候,我就纳闷了,因为不起作用,乍看一下才知道,连接了localhost的rabbitmq,可我本地没有搭建rabbitMq啊,于是又在linux系统上搭了一个rabbitmq服务器(具体搭建可以搜索其他文章),配置好了之后,在项目里设置一下我rabbitmq服务器的相关信息,就可以连上去了。
另外,这里说个题外话,rabbitMQ搭建在linux上后,注意他是默认开启5672端口的。所以要么就开启一下5672端口,要么像我一样,因为是自己电脑虚拟机搭建的,所以就干脆把防火墙给关了。然后可以试着用浏览器访问 ip:15672 ,我这里是访问192.168.25.130:15672就进入rabbitMQ的webUI界面了。成功就说明可以连接rabbitMQ。
接着讲这个订阅项目~
在项目的主类: SpringCloudStreamBindingInputApplication.java中
@SpringBootApplication @EnableBinding(Sink.class) public class SpringCloudStreamBindingInputApplication { private static Logger logger = LoggerFactory.getLogger(SpringCloudStreamBindingInputApplication.class); public static void main(String[] args) { SpringApplication.run(SpringCloudStreamBindingInputApplication.class, args); } @StreamListener(Sink.INPUT) public void sinkMessage(Object message) { logger.info("received message:" + message.toString()); } }
以上,就把订阅项目做好了。详细注解的用法搜索其他博客文章应该会讲述。
第二步:搭建发布项目,项目名为:spring-cloud-stream-binding-output
pom.xml文件与上个项目相同,
application.properties文件也与上个项目相同,只不过添加一个属性:
fixedDelay: 5000 #设置继上一个任务之后,延时时间间隔
然后启动类:SpringCloudStreamBindingOutputApplication.java文件内容为:
@SpringBootApplication @EnableBinding(Source.class) // 该注解用来绑定输出的管道,进行消息推送。本案例就推送格式化的时间 public class SpringCloudStreamBindingOutputApplication { private static Logger logger = LoggerFactory.getLogger(SpringCloudStreamBindingOutputApplication.class); public static void main(String[] args) { SpringApplication.run(SpringCloudStreamBindingOutputApplication.class, args); } @InboundChannelAdapter(value = Source.OUTPUT) public String timerMessageSource() { String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); logger.info("publish message: " + format); return format; } }
这里通过发送当前时间作为消息主体。
测试:
依次启动spring-cloud-stream-binding-input、spring-cloud-stream-binding-output项目。
然后便可以看到两个项目的控制台交替打印消息:
以下为input项目控制台信息。
以下为output项目控制台信息:
可以看到,都有“Attempting to connect to: [192.168.25.130:5672]”的信息,这里可以确认你所访问的rabbitMQ是否配置是正确的。其次便是日期消息的相互交替输出,说明结果无误。
另外,我这里用浏览器访问 192.168.25.130:15672便可以登录rabbitMQ的图形化界面去查看消息队列和连接的情况。
这里让我比较纳闷的是,命名只开了发布和订阅两个项目,莫名其妙出现了三个连接。真是神奇。。都不知道是怎么回事。