基于RabbitMQ的消息推送
本文详细介绍如何利用RabbitMQ结合WebSocket实现高效消息推送。从Webstomp插件的启用到Gradle项目的创建,再到生产者与消费者的实现,一步步解析RabbitMQ在实时通信中的应用。同时,对比传统轮询方式,突出了WebSocket在减少带宽消耗和服务器资源浪费方面的优势。
文章信息
- 原文链接:https://jiayq.blog.csdn.net/article/details/94471160
- 发布时间:2019-07-02 19:47:02
- 阅读量:2
- 分类:RabbitMQ专栏收录该内容, 订阅专栏
- 标签:#RabbitMQ消息推送, #服务器端主动发送消息给客户端
摘要
文章浏览阅读2.6k次。本文详细介绍如何利用RabbitMQ结合WebSocket实现高效消息推送。从Webstomp插件的启用到Gradle项目的创建,再到生产者与消费者的实现,一步步解析RabbitMQ在实时通信中的应用。同时,对比传统轮询方式,突出了WebSocket在减少带宽消耗和服务器资源浪费方面的优势。
基于RabbitMQ的消息推送
- 1.启用Web stomp插件
- 2.创建一个gradle项目
- 3.创建生产者
- 4.创建消费者(订阅者)
- 5.运行
- 6.总结
以前,浏览器中的推送功能通过轮询实现。但是这种模式的缺点是浏览器需要不断地向服务器发出请求,每次请求中的绝大部分数据都是相同的,里面包含的有效数据可能只是很小的一部分,这导致占用很多的带宽,而且不断地连接将大量消耗服务器资源。HTML5定义了WebSocket,它能够实现浏览器与服务器之间全双工通信。其优点有两个:一是服务器与客户端之间交换的标头信息很小;而是服务器可以主动传送数据给客户端。
1.启用Web stomp插件
在RabbitMQ的sbin目录下执行
1
rabbitmq-plugins enable rabbitmq_web_stomp
2.创建一个gradle项目

创建目录结构

其中红色的文件夹不用创建,gradle会自动创建。
添加依赖的包
在build.grdle的dependencies中增加

3.创建生产者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.study.produce;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Random;
/**
* @author jiayq
*/
public class StompProduce {
public static void main(String[] args) throws Exception {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
ConnectionFactory factory = (ConnectionFactory) applicationContext.getBean("factory");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("exchange_stomp", "topic");
channel.queueDeclare("queue_stomp", false, false, false, null);
channel.queueBind("queue_stomp", "exchange_stomp", "*.test");
while (true) {
String message = new String(new Random().nextDouble()+"");
channel.basicPublish("exchange_stomp", "test.test",
null, message.getBytes());
System.out.println("message:\t" + message);
Thread.sleep(3 * 1000);
}
}
}
4.创建消费者(订阅者)
在resources中的webapp中增加如下目录

其中jquery.min.js和stomp.js可以在网上下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RabbitMqPublish socket</title>
<script type="text/javascript" src="stomp.js"></script>
<script type="text/javascript" src="jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function () {
//创建客户端
var client = Stomp.client("ws://localhost:15674/ws");
//定义连接成功回调函数
var onConnect = function () {
//订阅商品折扣主题的消息
client.subscribe("/exchange/exchange_stomp/test.test", function (message) {
//弹出业务消息提醒
$("#body").append("\t" + message.body + "<br/>");
});
};
//定义错误时回调函数
var onError = function (msg) {
$("#body").html(msg);
};
//连接服务器
client.connect("guest", "guest", onConnect, onError);
client.heartbeat.incoming = 5000;
client.heartbeat.outgoing = 5000;
});
</script>
<body>
<div id="body"></div>
</body>
</html>
5.运行
打开界面,然后启动生产者
6.总结
在JavaScript中与STOMP服务器通信,首先要创建一个STOMP对象,调用Stomp.clent(url)函数。
例子中的localhost是RabbitMQ服务器的地址,在实际使用时可以改成服务器的IP地址,插件默认监听15674端口,在stomp.js中使用ws://URL格式。
在stomp.js中用connect函数连接服务器。前两个参数是用户名和密码,后两个时候成功与失败的回调。
个人认为,RabbitMQ最大的优势在于提供了比较灵活的消息路由策略,高可用性、可靠性,以及丰富的插件、多种平台支持和完善的文档。不过,由于AMQP协议本身导致它的实现比较重量,从而使得与其他MQ(比如Kafka)对比其吞吐量处于下风。



