借助于 RabbitMQ 的 Web STOMP 插件,实现浏览器与服务端的全双工通信。从本质上说,RabbitMQ 的 Web STOMP 插件也是利用 WebSocket 对 STOMP 协议进行了一次桥接,从而实现浏览器与服务端的双向通信。
安装 RabbitMQ 服务
mac安装rabbitmq
brew update
brew install rabbitmq
耐心等待,安装完成后需要将/usr/local/sbin添加到$PATH,可以将下面这两行加到~/.bash_profile:
# RabbitMQ Config
export PATH=$PATH:/usr/local/sbin
编辑完后:wq保存退出,使环境变量立即生效。
source ~/.bash_profile
启动rabbitmq
rabbitmq-server
启用相关插件
rabbitmq-plugins enable rabbitmq_management rabbitmq_web_stomp rabbitmq_stomp
重启 RabbitMQ 服务
service rabbitmq-server restart
验证是否安装成功
通过 Web 浏览器来查看 RabbitMQ 的运行状态,浏览器中输入 http://{server_ip}:15672,用 guest/guest 默认的用户和密码登录后即可查看 RabbitMQ 的运行状态。
基于 RabbitMQ 的实时消息推送
RabbitMQ 有很多第三方插件,可以在 AMQP 协议基础上做出许多扩展的应用。Web STOMP 插件就是基于 AMQP 之上的 STOMP 文本协议插件,利用 WebSocket 能够轻松实现浏览器和服务器之间的实时消息传递。
消息发送者
Java 作为 RabbitMQ 客户端消息发送者,Web 浏览器作为消息消费者。
package com.ibm.cdl.itaas.stomp;
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("127.0.0.1");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("rabbitmq", "fanout");
String routingKey = "rabbitmq_routingkey";
String message = "{\"name\":\"推送测试数据!\"}";
channel.basicPublish("rabbitmq", routingKey,null, message.getBytes());
System.out.println("[x] Sent Message:"+message);
channel.close();
connection.close();
}
}
这里我们利用 RabbitMQ 官方提供的 Java Client Library 来实现消息的发送
exchange 接收到消息后,会根据消息的 key 和已经设置的 binding 进行消息路由,最终投递到一个或多个队列里进行消息处理。RabbitMQ 预置了一些 exchange,如果客户端未声明 exchange 时,RabbitMQ 会根据 exchange 类型使用默认的 exchange。
预置exchange名称
Exchange 类型
1.Direct exchange
Direct exchange 完全根据 key 进行投递,只有 key 与绑定时的 routing key 完全一致的消息才会收到消息,参考官网提供的图 4 更直观地了解 Direct exchange。