StompJS使用文档总结
STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。
一、创建STOMP
客户端
1、在web浏览器中使用普通的Web Socket
STOMP javascript 客户端会使用ws://
的URL与STOMP 服务端进行交互。
为了创建一个STOMP客户端js对象,你需要使用Stomp.client(url)
,而这个URL连接着服务端的WebSocket的代理
var url = "ws://localhost:61614/stomp";
var client = Stomp.client(url);
Stomp.client(url, protocols)
也可以用来覆盖默认的subprotocols
。第二个参数可以是一个字符串或一个字符串数组去指定多个subprotocols
。
2、在web浏览器中使用定制的WebSocket
浏览器提供了不同的WebSocket的协议,一些老的浏览器不支持WebSocket的脚本或者使用别的名字。默认下,stomp.js
会使用浏览器原生的WebSocket class
去创建WebSocket。
但是利用Stomp.over(ws)
这个方法可以使用其他类型的WebSockets。这个方法得到一个满足WebSocket定义的对象。
例如,可以使用由SockJS
实现的Websocket。
如果使用原生的Websockets就使用Stomp.client(url)
,如果需要使用其他类型的Websocket(例如由SockJS包装的Websocket)就使用Stomp.over(ws)
。除了初始化有差别,Stomp API在这两种方式下是相同的。
3、在node.js
程序中
通过stompjs npm package
同样也可以在node.js
程序中使用这个库。
npm install stompjs
在node.js app
中,require
这个模块:var Stomp = require('stompjs');
为了与建立在TCP socket的STOMP-broker连接,使用Stomp.overTCP(host, port)
方法。
var client = Stomp.overTCP('localhost', );
为了与建立在Web Socket的STOMP broker连接,使用Stomp.overWS(url)
方法。
var client = Stomp.overWS('ws://localhost:61614/stomp');
除了初始化不同,无论是浏览器还是node.js环境下,Stomp API都是相同的。
二、链接服务端
一旦Stomp 客户端建立了,必须调用它的connect()
方法去连接Stomp服务端进行验证。这个方法需要两个参数,用户的登录和密码凭证。这种情况下,客户端会使用Websocket打开连接,并发送一个CONNECT frame
。
这个连接是异步进行的:你不能保证当这个方法返回时是有效连接的。为了知道连接的结果,你需要一个回调函数。
var connect_callback = function() {
// called back after the client is connected and authenticated to the STOMP server
};
但是如果连接失败会发生什么呢?
connect()
方法接受一个可选的参数(error_callback
),当客户端不能连接上服务端时,这个回调函数error_callback
会被调用,该函数的参数为对应的错误对象。
var error_callback = function(error) {
// display the error's message header:
alert(error.headers.message);
};
在大多数情况下,connect()
方法可接受不同数量的参数来提供简单的API:
client.connect(login, passcode, connectCallback);
client.connect(login, passcode, connectCallback, errorCallback);
client.connect(login, passcode, connectCallback, errorCallback, host);
login
和passcode
是strings,connectCallback
和errorCallback
则是functions。(有些brokers(代理)还需要传递一个host
(String类型)参数。)
如果你需要附加一个headers
头部,connect
方法还接受其他两种形式的参数:
client.connect(headers, connectCallback);
client.connect(headers, connectCallback, errorCallback);
header
是map
形式,connectCallback
和errorCallback
为functions。
需要注意:如果你使用上述这种方式,你需要自行在headers
添加login
、passcode
(甚至host
):
var headers = {
login: 'mylogin',
passcode: 'mypasscode',
// additional header
'client-id': 'my-client-id'
};
client.connect(headers, connectCallback);
断开连接时,调用disconnect
方法,这个方法也是异步的,当断开成功后会接收一个额外的回调函数的参数。如下所示。
client.disconnect(function() {
alert("See you next time!");
};
当客户端与服务端断开连接,就不会再发送或接收消息了。
三、Heart-beating
如果STOMP broker(代理)接收STOMP 1.1版本的帧,heart-beating
是默认启用的。
heart-beating
也就是频率,incoming
是接收频率,outgoing
是发送频率。通过改变incoming
和outgoing
可以更改客户端的heart-beating
(默认为10000ms):
client.heartbeat.outgoing = ;
// client will send heartbeats every 20000ms
client.heartbeat.incoming = ;
// client does not want to receive heartbeats
// from the server
heart-beating
是利用window.setInterval()
去规律地发送heart-beats
或者检查服务端的heart-beats
。
四、发送消息
当客户端与服务端连接成功后,可以调用send()
来发送STOMP消息。这个方法必须有一个参数,用来描述对应的STOMP的目的地。另外可以有两个可选的参数:headers
,object
类型包含额外的信息头部;body
,一个String类型的参数。
client.send("/queue/test", {priority: }, "Hello, STOMP");
// client会发送一个STOMP发送帧给/queue/test,这个帧包含一个设置了priority为9的header和内容为“Hello, STOMP”的body。
client.send(destination, {}, body);
如果你想发送一个有body
的信息,也必须传递headers
参数。如果没有headers
需要传递,那么就传{}
即可。
五、订阅(Subscribe)和接收(receive)消息
为了在浏览器中接收消息,STOMP客户端必须先订阅一个目的地destination
。
你可以使用subscribe()
去订阅。这个方法有2个必需的参数:目的地(destination
),回调函数(callback
);还有一个可选的参数headers
。其中destination
是String类型,对应目的地,回调函数是伴随着一个参数的function
类型。
var subscription = client.subscribe("/queue/test", callback);
subscribe()
方法返回一个object
,这个object
包含一个id
属性,对应这个这个客户端的订阅ID。
而unsubscribe()
可以用来取消客户端对这个目的地destination
的订阅。
默认情况下,如果没有在headers
额外添加,这个库会默认构建一个独一无二的ID
。在传递headers
这个参数时,可以使用你自己的ID
。
var mysubid = '...';
var subscription = client.subscribe(destination, callback, { id: mysubid });
这个客户端会向服务端发送一个STOMP订阅帧(SUBSCRIBE frame
)并注册回调事件。每次服务端向客户端发送消息时,客户端都会轮流调用回调函数,参数为对应消息的STOMP帧对象(Frame object
)。
subscribe()
方法,接受一个可选的headers
参数用来标识附加的头部。
var headers = {ack: 'client', 'selector': "location = 'Europe'"};
client.subscribe("/queue/test", message_callback, headers);
这个客户端指定了它会确认接收的信息,只接收符合这个selector : location = 'Europe'
的消息。
如果想让客户端订阅多个目的地,你可以在接收所有信息的时候调用相同的回调函数:
onmessage = function(message) {
// called every time the client receives a message
}
var sub1 = client.subscribe("queue/test", onmessage);
var sub2 = client.subscribe("queue/another", onmessage)
如果要中止接收消息,客户端可以在subscribe()
返回的object
对象调用unsubscribe()
来结束接收。
var subscription = client.subscribe(...);
...
subscription.unsubscribe();
六、支持JSON
STOMP消息的body
必须为字符串。如果你需要发送/接收JSON
对象,你可以使用JSON.stringify()
和JSON.parse()
去转换JSON对象。
七、Acknowledgment(确认)
默认情况,在消息发送给客户端之前,服务端会自动确认(acknowledged
)。
客户端可以选择通过订阅一个目的地时设置一个ack header
为client
或client-individual
来处理消息确认。
在下面这个例子,客户端必须调用message.ack()
来通知服务端它已经接收了消息。
var subscription = client.subscribe("/queue/test",
function(message) {
// do something with the message
...
// and acknowledge it
message.ack();
},
{ack: 'client'}
);
ack()
接受headers
参数用来附加确认消息。例如,将消息作为事务(transaction)的一部分,当要求接收消息时其实代理(broker)已经将ACK STOMP frame
处理了。
var tx = client.begin();
message.ack({ transaction: tx.id, receipt: 'my-receipt' });
tx.commit();
nack()
也可以用来通知STOMP 1.1.brokers(代理):客户端不能消费这个消息。与ack()
方法的参数相同。
八、事务(Transactions)
可以在将消息的发送和确认接收放在一个事务中。
客户端调用自身的begin()
方法就可以开始启动事务了,begin()
有一个可选的参数transaction
,一个唯一的可标识事务的字符串。如果没有传递这个参数,那么库会自动构建一个。这个方法会返回一个object。这个对象有一个id
属性对应这个事务的ID,还有两个方法:
commit()
提交事务
abort()
中止事务
在一个事务中,客户端可以在发送/接受消息时指定transaction id来设置transaction。
// start the transaction
var tx = client.begin();
// send the message in a transaction
client.send("/queue/test", {transaction: tx.id}, "message in a transaction");
// commit the transaction to effectively send the message
tx.commit();
如果你在调用send()
方法发送消息的时候忘记添加transction header,那么这不会称为事务的一部分,这个消息会直接发送,不会等到事务完成后才发送。
var txid = "unique_transaction_identifier";
// start the transaction
var tx = client.begin();
// oops! send the message outside the transaction
client.send("/queue/test", {}, "I thought I was in a transaction!");
tx.abort(); // Too late! the message has been sent
九、调试
有一些测试代码能有助于你知道库发送或接收的是什么,从而来调试程序。
客户端可以将其debug
属性设置为一个函数,传递一个字符串参数去观察库所有的debug语句。默认情况,debug消息会被记录在在浏览器的控制台。
client.debug = function(str) {
// append the debug log to a #debug div somewhere in the page using JQuery:
$("#debug").append(str + "\n");
};
十、使用情况
1、var error_callback = function(error) {
第一次连接失败和连接后断开连接都会调用这个函数
};
2、关闭控制台调试数据:设置client.debug = null
就可以,stompjs会去检测debug是否是函数,不是函数就不会调用输出
StompJS使用文档总结的更多相关文章
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
- ABP文档 - EntityFramework 集成
文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...
- ABP文档 - SignalR 集成
文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...
- ABP文档 - 通知系统
文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...
- ABP文档 - Hangfire 集成
文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...
- ABP文档 - 后台作业和工作者
文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...
- ABP文档 - Javascript Api
文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...
随机推荐
- P1330 封锁阳光大学 DFS
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- Spring(六)Spring执行流程
Spring MVC工作流程图 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherS ...
- php(apache)切换版本
php(apache)切换版本 1.brew link php@7.1 2.上两行写入 ~/.bash_profile文件 3.source ~/.bash_profile 4.sudo vi /et ...
- idea工具maven生命周期clean,install,package等区别
idea工具maven projects里面有9种生命周期,生命周期是包含在一个项目构建中的一系列有序的阶段. 一.最常用的两种打包方法: 1.clean,package(如果报错,很可能就是jar依 ...
- HDU 2586 How far away ?(经典)(RMQ + 在线ST+ Tarjan离线) 【LCA】
<题目链接> 题目大意:给你一棵带有边权的树,然后进行q次查询,每次查询输出指定两个节点之间的距离. 解题分析:本题有多重解决方法,首先,可用最短路轻易求解.若只用LCA解决本题,也有三种 ...
- 大数据技术 - MapReduce的Shuffle及调优
本章内容我们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要 ...
- springmvc controller动态设置content-type
springmvc RequestMappingHandlerAdapter#invokeHandlerMethod 通过ServletInvocableHandlerMethod#invokeAn ...
- JavaIO流中的拷贝
JavaIO流中对数据的操作尤为重要,掌握了基本的拷贝操作,才能将各种数据源的操作联系起来. 先来看看对文件夹的拷贝吧: /** * 利用递归实现文件夹的拷贝操作 * 分析:判断 * 是文件:调用拷贝 ...
- spring mvc简单介绍xml版
spring mvc介绍:其实spring mvc就是基于servlet实现的,只不过他讲请求处理的流程分配的更细致而已. spring mvc核心理念的4个组件: 1.DispatcherServl ...
- SpringBoot的第一个web项目
这一节主要是讲springboot搭建简单的web项目. 首先pom文件新增spring-boot-starter-web依赖,pom文件如下所示 <?xml version="1.0 ...