在 Web 页面中利用 WebSocket 使用 STOMP 协议只需要下载 stomp.js 即可,考虑到老版本的浏览器不支持 WebSocket,SockJS 则提供了 WebSocket 的模拟支持。Web 页面中使用 STOMP 协议详见下列代码清单:
清单 3.JavaScript 代码// 初始化 ws 对象 if (location.search == '?ws') { var ws = new WebSocket('ws://192.168.1.102:15674/ws'); } else { var ws = new SockJS('http://192.168.1.102:15674/stomp'); } // 建立连接 var client = Stomp.over(ws); // SockJS does not support heart-beat: disable heart-beats client.heartbeat.outgoing = 0; client.heartbeat.incoming = 0; // 定义连接成功回调函数 var on_connect = function(x) { console.log('connect successfully'); // 发送消息 client.send(destination,head,body); // 发送消息 client.subcribe(destination,callback); // 默认主动 ACK,手动 ACK client.subcribe(destination,function(message){ Message.ack(); },{ack:'client'}); // 事务支持 var tx = client.begin(); client.send(destination,head,body); tx.commit(); }; // 定义连接失败回调函数 var on_error = function(error) { console.log(error.headers.message); }; // 连接消息服务器 client.connect(login, password, on_connect, on_error, '/');
上面提到的 destination 在 RabbitMQ Web STOM 中进行了相关的定义,根据使用场景的不同,主要有以下 4 种:
1./exchange/<exchangeName>
对于 SUBCRIBE frame,destination 一般为/exchange/<exchangeName>/[/pattern] 的形式。该 destination 会创建一个唯一的、自动删除的、名为<exchangeName>的 queue,并根据 pattern 将该 queue 绑定到所给的 exchange,实现对该队列的消息订阅。
对于 SEND frame,destination 一般为/exchange/<exchangeName>/[/routingKey] 的形式。这种情况下消息就会被发送到定义的 exchange 中,并且指定了 routingKey。
2./queue/<queueName>
对于 SUBCRIBE frame,destination 会定义<queueName>的共享 queue,并且实现对该队列的消息订阅。
对于 SEND frame,destination 只会在第一次发送消息的时候会定义<queueName>的共享 queue。该消息会被发送到默认的 exchange 中,routingKey 即为<queueName>。
3./amq/queue/<queueName>
这种情况下无论是 SUBCRIBE frame 还是 SEND frame 都不会产生 queue。但如果该 queue 不存在,SUBCRIBE frame 会报错。
对于 SUBCRIBE frame,destination 会实现对队列<queueName>的消息订阅。
对于 SEND frame,消息会通过默认的 exhcange 直接被发送到队列<queueName>中。
4./topic/<topicName>
对于 SUBCRIBE frame,destination 创建出自动删除的、非持久的 queue 并根据 routingkey 为<topicName>绑定到 amq.topic exchange 上,同时实现对该 queue 的订阅。
对于 SEND frame,消息会被发送到 amq.topic exchange 中,routingKey 为<topicName>。
图 6.Java 端发送消息 图 7.JavaScript 端实时响应 小结WebSocket 作为 HTML5 提供的新一代客户端-服务器异步通信方法,能够轻松完成前端与后台的双向通信。RabbitMQ 服务提供了一个 STOMP 插件,能够实现与 WebSocket 的桥接,这样既能够实现消息的主动推送,同时也能够实现消息的异步处理。在传统的 Web 开发中存在许多状态变更实时性的需求,比如资源被占用后需要广播它的实时状态,利用本文提出的解决方案,可以方便将其推送到所有监听的客户端。因此在新 J2EE 开发项目中,建议使用本文提出的方案替代原来 ajax 轮询方法刷新状态。
相关文件到Linux公社资源站下载:
------------------------------------------分割线------------------------------------------
具体下载目录在 /2016年资料/11月/10日/基于 RabbitMQ 的实时消息推送/
------------------------------------------分割线------------------------------------------