java 消息推送_基于 RabbitMQ 的实时消息推送

实现服务器端推送的几种方式

Web 应用都是基于 HTTP 协议的请求/响应模式,无法像 TCP 协议那样保持长连接,因此 Web 应用就很难像手机那样实现实时的消息推送。就目前来看,Web 应用的消息推送方式主要有以下几种:

1.Ajax 短轮询

Ajax 轮询主要通过页面端的 JS 定时异步刷新任务来实现数据的加载,但这种方式实时效果较差,而且对服务端的压力也较大。

2. 长轮询

长轮询主要也是通过 Ajax 机制,但区别于传统的 Ajax 应用,长轮询的服务器端会在没有数据时阻塞请求直到有新的数据产生或者请求超时才返回,之后客户端再重新建立连接获取数据,具体实现方式见图 1 所示。但长轮询服务端会长时间地占用资源,如果消息频繁发送的话会给服务端带来较大的压力。

图 1. 长轮询实现方式

219fc13d2cef2046fdc204bff6c29904.png

3.WebSocket 双向通信

WebSocket 是 HTML5 中一种新的通信协议,能够实现浏览器与服务器之间全双工通信。如果浏览器和服务端都支持 WebSocket 协议的话,该方式实现的消息推送无疑是最高效、简洁的。并且最新版本的 IE、Firefox、Chrome 等浏览器都已经支持 WebSocket 协议,Apache Tomcat 7.0.27 以后的版本也开始支持 WebSocket。

RabbitMQ 简介

AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列和路由,可靠且安全。RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 Ajax。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ 中有一些概念需要我们在使用前先搞清楚,主要包括以下几个:Broker、Exchange、Queue、Binding、Routingkey、Producter、Consumer、Channel。

1.Broker

简单来说就是消息队列服务器的实体。

2.Exchange

接收消息,转发消息到绑定的队列上,指定消息按什么规则,路由到哪个队列。

3.Queue

消息队列载体,用来存储消息,相同属性的 queue 可以重复定义,每个消息都会被投入到一个或多个队列。

4.Binding

绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来。

5.RoutingKey

路由关键字,Exchange 根据这个关键字进行消息投递。

6.Producter

消息生产者,产生消息的程序。

7.Consumer

消息消费者,接收消息的程序。

8.Channel

消息通道,在客户端的每个连接里可建立多个 Channel,每个 channel 代表一个会话。

安装 RabbitMQ 服务

本文提出的方案是基于 RabbitMQ 消息服务器,因此最开始需要安装 RabbitMQ 服务及相关插件。RabbitMQ 是基于 Erlang 语言开发的,所以首先必须安装 Erlang 运行时环境。下面以 CentOS6.5 64 位服务器为例,讲述整个服务的安装过程:

1. 下载 erlang-R15B-02.1.el5.x86_64.rpm 并安装

1

# rpm -ivh erlang-R15B-02.1.el5.x86_64.rpm

2. 下载 rabbitmq-server-3.2.1-1.noarch.rpm 并安装

1

# rpm -ivh rabbitmq-server-3.2.1-1.noarch.rpm

3. 启用相关插件

1

# rabbitmq-plugins enable rabbitmq_management rabbitmq_web_stomp rabbitmq_stomp

4. 重启 RabbitMQ 服务

1

# service rabbitmq-server restart

5. 验证是否安装成功

此时我们可能通过 Web 浏览器来查看 RabbitMQ 的运行状态,浏览器中输入 http://{server_ip}:15672,用 guest/guest 默认的用户和密码登录后即可查看 RabbitMQ 的运行状态。

基于 RabbitMQ 的实时消息推送

RabbitMQ 有很多第三方插件,可以在 AMQP 协议基础上做出许多扩展的应用。Web STOMP 插件就是基于 AMQP 之上的 STOMP 文本协议插件,利用 WebSocket 能够轻松实现浏览器和服务器之间的实时消息传递,具体实现方式如下图 2 所示:

图 2. 浏览器和服务器之间的实时消息传递实现

563b15b1322312b8dbad835b7340ebee.png

消息发送者

下面举个例子来说明整个过程,以 Java 作为 RabbitMQ 客户端消息发送者,Web 浏览器作为消息消费者。

清单 1.Java 端代码

import java.io.IOException;import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;public class Program { public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("192.168.1.101"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare("rabbitmq
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Java来实现RabbitMQ消息推送,首先需要引入RabbitMQ的jar包。根据引用,我们可以通过引入amqp-client的包来实现。在你的项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> </dependency> ``` 接下来,你需要建立与RabbitMQ连接,创建一个通道,以及声明一个队列来发送消息。以下是一个基本的示例代码: ```java import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; public class RabbitMQProducer { private final static String QUEUE_NAME = "my_queue"; public static void main(String[] argv) throws Exception { // 建立连接 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); // 声明队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 发送消息 String message = "Hello, RabbitMQ!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println("Sent message: " + message); // 关闭连接 channel.close(); connection.close(); } } ``` 这段代码首先建立与RabbitMQ连接,然后创建一个通道,并声明一个名为"my_queue"的队列。接着,它发送了一条消息"Hello, RabbitMQ!"到该队列中。最后,关闭了通道和连接。 以上是一个简单的Java实现RabbitMQ消息推送的例子,你可以根据自己的需求修改其中的细节。希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [使用Java体验RabbitMQ消息的发送与消费过程](https://blog.csdn.net/cssweb_sh/article/details/125133874)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java编程rabbitMQ实现消息的收发](https://download.csdn.net/download/weixin_38570278/12772878)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值