自用的油猴脚本需要追加一个消息推送的功能,决定用 RabbitMQ 消费者的方式实现,但是看了下 JavaScript 连接 RabbitMQ 一般都是加装 STOMP 相关的插件使其支持 WebSocket 连接方式。
我的 RabbitMQ 是 Docker 直接启动的,需要进入容器里执行,和一般的安装版本有些区别,于是还是决定记录一下顺便写个 JS 的例子。
1、Docker 启动 RabbitMQ
一笔带过了:
docker run -d --name rabbitmq --restart=always -p 5672:5672 -p 15672:15672 -p 15674:15674 rabbitmq:3.9-management
注意这里的
15674
端口是用以 WebSocket 连接的,一定要配置映射并在宿主机上开放!
如果你之前没有开启的话,请停止容器并手动修改配置文件后重启。
① 停止容器:# 查看所有容器,并记录 CONTAINER ID docker ps -a # 停止容器 docker stop 164xxxxxx282 # 停止 Docker 服务 service docker stop
② 修改对应容器的配置文件,首先进入文件夹:
cd /var/lib/docker/containers/$CONTAINER_ID/
修改第一个配置文件:
vi hostconfig.json
... ... { "PortBindings":{ "15674/tcp":[{"HostIp":"","HostPort":"15674"}] } } ... ...
修改第二个配置文件
vi config.v2.json
... ... { "ExposedPorts":{ "15674/tcp":{} } } ... ...
③ 重启 Docker 服务和容器:
service docker start docker start $CONTAINER_ID
再检查容器就可以看到
15674
端口映射好了。
确保宿主机对应端口和防火墙开启后,访问 http://IP:15672 就可以访问到管理页面,账户密码均为 guest
:
同时可以看到当前是 STOMP 相关服务的监听端口的。
2、进入容器安装 STOMP 相关插件
进入 RabbitMQ 容器:
docker exec -it $CONTAINER_ID /bin/bash
安装 STOMP 相关插件:
rabbitmq-plugins enable rabbitmq_web_stomp rabbitmq_web_stomp_examples
之后退出容器。
3、重启容器
执行:
docker restart $CONTAINER_ID
重启之后回到管理页面,看到有 stomp
服务和其监听端口就说明成功了:
4、JavaScript 连接样例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RabbitMQ WebSocket 测试页面</title>
<!-- 依赖的包 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.6.0/sockjs.js"></script>
<script type="text/javascript">
// 连接信息,自行替换 IP
var yourIp = "127.0.0.1";
var ws = new WebSocket("ws://"+yourIp+":15674/ws");
var client = Stomp.over(ws);
// 禁用心跳
client.heartbeat.outgoing = 0;
client.heartbeat.incoming = 0;
// 连接成功的回调函数
var on_connect = function(x) {
// 消费者
client.subscribe("/queue/queue", function(data) {
var msg = data.body;
$("#message").append("收到数据:" + msg);
});
};
// 出错时的回调函数
var on_error = function() {
console.log("error");
};
// 连接RabbitMQ,用户密码请自行替换
client.connect("guest", "guest", on_connect, on_error, "/");
console.log("已连接至 RabbitMQ!");
</script>
</head>
<body>
</body>
</html>
启动页面后,去控制台查看下日志:
运行正常的话到管理页面确定队列状态:
插入一条信息确认回调函数正常:
结束。