这个样例是2019年做的,这次挖出来分享各位。
所谓的RW通讯指的是RabbitMQ + WebStomp的通讯组件(以下简称“RW组件”)。也不是说不能使用原生的Websocket技术去做,但是相对来说在基于Html5实现场景下RW组件更显简单和稳定。下面将讲讲整个样例的搭建方式。
1. 启用Stomp插件
要在RabbitMQ中使用Stomp插件就必须要先安装,默认情况下该插件是关闭状态的。
因为我这边是management版本本来就已经包含了该插件,只需要对其进行启动就可以了。启动插件如上图所示,插件启动后重启RabbitMQ服务。
service rabbitmq-server restart
重启之后访问RabbitMQ就能够在控制台上看到Stomp插件已经加载,如下图:
从控制台中可以看出Stomp服务已经启动,基于Websocket协议的Stomp端口是15674,http的Stomp端口是61613。而Stomp例子的端口是15670。
2. 项目配置
本样例使用Spring boot项目和一个静态html页面模拟前后端通讯的情况,首先先看服务端配置。
2.1 pom配置
既然要与RabbitMQ通讯amqp依赖是必不可少的。
2.2 properties配置
此处配置RabbitMQ的访问参数,这里可以用yaml代替properties。
3. 代码说明
3.1 AmqpConfig.java
本样例中MQ将采用exchange(交换机)通讯类型,所以在AmqpConfig中加入相关配置,如下图:
这里定义了两个队列绑定到toolsExchange。其中一个是发送用,一个是接收用的。
3.2 RabbitmqDataTest.java
开发一个给前端发送信息的Junit单元测试类,模拟服务端推送信息。
如上图所示,通过setup方法将需要发送的内容先做预处理,将信息放入Lottery实体。然后通过test4Websocket方法中的rabbitTemplate.convertAndSend将信息发送到交换机中。至于交换机是如何找到队列,而队列又是怎样推送的这里就不详细将这个不在本文讨论的范畴里面,这个很多将RabbitMQ的教程都已经说过了。
3.3 amqp.html
直接手撸了一段html代码作为测试使用。由于考虑到微信小程序和其他特殊情况下不能使用sockjs组件,所以本次的测试代码中不引用sockjs组件直接引用stomp.js编写Websocket交互。初始化Websocket对象时直接使用ws协议,通过15674端口访问RabbitMQ中的Stomp。
subscribe(订阅)中指定了“/queue/tools.send”作为订阅地址,通过接收data并获取body内容获取到后台传送过来的数据。
client.connect中定义的就是RabbitMQ的登录名和密码以及虚拟主机的路径。在下方点击事件中client.send将信息发送到消息队列,其中msg为发送的数据(由于只是测试页面所以就没有做严密的校验了,希望大家见谅)。
3.4 RabbitmqReceive.java
前端发送信息后服务端通过@RabbitListener注解监听RabbitMQ队列的情况,如下图:
通过@RabbitHandler和@RabbitListener来告诉系统getMsgRecive方法为RabbitMQ的监听和处理方法。由于发送过来的数据是acsii码,所以将其重新转换为字符串就可以正常输出。
4. 样例效果
浏览器打开html页面的时候就先会建立Websocket连接。
在页面输入信息并点击按钮发送。
后台输出显示信息接收成功。
前端接收来自后端的触发数据。