基于RabbitMQ的消息推送


以前,浏览器中的推送功能通过轮询实现。但是这种模式的缺点是浏览器需要不断地向服务器发出请求,每次请求中的绝大部分数据都是相同的,里面包含的有效数据可能只是很小的一部分,这导致占用很多的带宽,而且不断地连接将大量消耗服务器资源。HTML5定义了WebSocket,它能够实现浏览器与服务器之间全双工通信。其优点有两个:一是服务器与客户端之间交换的标头信息很小;而是服务器可以主动传送数据给客户端。

1.启用Web stomp插件

在RabbitMQ的sbin目录下执行

rabbitmq-plugins enable rabbitmq_web_stomp

2.创建一个gradle项目

在这里插入图片描述
创建目录结构
在这里插入图片描述
其中红色的文件夹不用创建,gradle会自动创建。
添加依赖的包
在build.grdle的dependencies中增加
在这里插入图片描述

3.创建生产者

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可以在网上下载

<!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)对比其吞吐量处于下风。

WebSocket 和 RabbitMQ 可以结合使用来实现实时消息推送。WebSocket 是一种基于 TCP 的协议,它允许在客户端和服务器之间建立持久的双向通信通道。而 RabbitMQ 是一个消息代理和队列管理系统,可以实现消息的可靠传输和分发。 下面是使用 WebSocket 和 RabbitMQ 实现实时消息推送的一般步骤: 1. 配置 WebSocket 服务器:在后端应用程序中,你需要配置一个 WebSocket 服务器,用于接收和处理客户端的 WebSocket 连接请求。可以使用 Spring Boot 中的 Spring WebSocket 或其他 WebSocket 框架进行配置。 2. 配置 RabbitMQ:在后端应用程序中,你需要配置 RabbitMQ 的连接信息,并创建一个或多个交换机和队列。可以使用 RabbitMQ 的 Java 客户端库进行配置。 3. 监听 RabbitMQ 消息:在后端应用程序中,你需要监听 RabbitMQ 中指定队列的消息。当有新的消息到达时,通过 WebSocket 服务器将消息推送客户端。 4. 前端连接 WebSocket:在前端应用程序中,你需要使用 JavaScript 的 WebSocket API 连接到后端的 WebSocket 服务器。 5. 接收消息并更新 UI:在前端应用程序中,当接收到 WebSocket 服务器推送消息时,你可以在界面上实时展示或处理这些消息。 通过结合使用 WebSocket 和 RabbitMQ,你可以实现实时、双向的消息通信,并将消息推送给多个客户端。这种方式适用于需要实时更新消息的应用场景,如聊天应用、实时监控等。需要根据具体的技术栈和需求进行相应的配置和开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值