`
DiaoCow
  • 浏览: 243706 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Stomp协议学习与实战

 
阅读更多
最近工作中使用到Stomp协议,现在做个总结!

Stomp是一个简单的消息文本协议,它的设计核心理念就是简单与可用性,官方文档:http://stomp.github.com/stomp-specification-1.1.html

现在我们就来实践一下Stomp协议,你需要的是:

1.一个支持stomp消息协议的messaging server(譬如activemq,rabbitmq);
2.一个终端(譬如linux shell);
3.一些基本命令与操作(譬如nc,telnet)

1.建立连接
当我们(Client端)向服务器发送一个CONNECT Frame,就向服务器发起了一个连接请求,此时服务器端返回一个CONNECTED Frame表示建立连接成功,其中头字段version表示采用的stomp协议版本(这里默认是1.0)


ps: ^@符号 ctrl+@键(用来提交请求),删除之前输入的数据 ctrl+n+backspace键

当然Client端也可指定所支持的协议版本(accept-version字段,多个版本按递增顺序排列,并用逗号分隔);



服务器此时返回的CONNECTED Frame中会列出它所支持的协议版本号中最高的那个(如上图的version:1.1)

如果服务器端不支持客户端所列举的协议版本(比如这里的2.1),那么服务器会返回一个ERROR Frame并且列举出服务器自己所支持的协议版本(如下图的version:1.0,1.1)




2.消息传递
客户端一旦与服务器端建立连接,那么就可发送下列Frame进行消息传递
SEND
SUBSCRIBE
UNSUBSCRIBE
ACK
NACK
BEGIN
COMMIT
ABORT
DISCONNECT

SEND Frame 用来将客户端消息发送到目的地(destination),因此它必须指定一个destination头字段,另外在所有头字段之后,新起一个空行,之后就是需要发送的消息(譬如这里的 hello stomp!)



此时"hello stomp!" 这条消息就被发送到了队列 my_queue中去

现在我们再起一个客户端clinet_a,来接受这个队列(myqueue)中的消息



SUBSCRIBE Frame 表示客户端希望订阅某一个目的地(destination)的消息(这里是/queue/my_queue),其中头字段id表示在一个会话连接里,唯一标示一个订阅者(subscription),头字段destination标示该订阅者(subscription)需要订阅的目的地(这里是一个队列,/queue/my_queue)

紧接着,我们就接受到服务器端发送来的消息(MESSAGE Frame),其中message_id:唯一标示了这条消息(后面我们会使用这个消息id进行ack,uack操作),content-length:标示消息体的长度,在所有这些头后面,新起一个空行就是消息内容(如这里的hello stomp!)

如此时我们希望订阅另一个destination,该如何办呢?,是不是再发送一个SUBSCRIBE Frame就好了?



结果发现服务器端返回了ERROR Frame 告诉我们SUBSCRIBE失败,原来同一个subscription id只能订阅一个destination,要想订阅令一个destination,必须先发送UNSUBSCRIBE Frame,然后再SUBSCRIBE 到新的目的地



UNSCUBSCRIBE Frame中的id标示需要取消订阅的subscription,然后我们在订阅到新的destination(这里是/queue/other_queue),可以发现订阅成功,服务器没有再发送ERROR Frame

至此,我们就模拟出了一个PTP(point-to-point)消息模型,下面我们也模拟下另外一个pub/sub消息模型:

准备工作,新起两个连接订阅到/topic/my_topic上,如下图:
clinet_a


client b


Send端发送广播消息:


我们去检查下两个消息接收客户端,果然发现收到了这条广播消息^_^
client a


client b


默认情况下,只要服务器端发送消息,就认为客户端接收成功(即ack模式为auto),若我们需要更严格的消息保证,则必须采用client模式,即由客户端确认消息的接受

服务器发送了一个消息到/queue/ackqueue



此时我们的客户端client_a确实接受到了该消息



虽然该消息已经发送到客户端,但是由于该消息没有确认(ack),则该消息还保存在队列/queue/ackqueue中(直到客户端确认才删除),我们可以通过rabbitmq提供的命令来查看(sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged):



若客户端在确认消息前与客户端断开连接,那么服务器可能(根据不同server的设计而不同)会选择将该消息发送给另一个subscription(这里是client_b)



可以看出rabbit是选择将它发送给另一个subscription, 我们在使用命令查ack_queue队列中是否还有未确认的消息



结果发现没有了 ^_^

若是客户端希望确认一个消息,该如何做呢?,只要发送一个ACK Frame即可!
在ACK Frame中,subscription标示是谁确认消息,message-id标示是确认哪条消息(即MESSAGE Frame中携带的message-id)



另外我在rabbitmq的测试结果发现,ack具有累积效应,譬如接收了10条消息,如果你ack了第8条消息,那么1-7条消息都会被ack,只有9-10两条消息还保持未ack状态

除了有ACK Frame,还有NACK Frame,它表示客户端未成功接收某条消息,这时候服务器可以选择重发或者丢弃(对于rabbitmq,我的测试结果是选择重发)


3.断开连接
说完了连接的建立,消息的发送与接收,现在我们来看看客户端如何与服务器断开连接的,更重要的是如何安全的断开连接



通过发送DISCONNNECT Frame表示向服务器发送一个断开连接请求,其中receipt表示服务器收到请求后请告知客户端,并返回一个相同的receipt-id


至此关于Stmop绝大部分概念,我们已经实践完毕,如需更详细的还请翻阅官方文档 ^_^


  • 大小: 8.8 KB
  • 大小: 9.9 KB
  • 大小: 10.4 KB
  • 大小: 3.8 KB
  • 大小: 11.1 KB
  • 大小: 15.2 KB
  • 大小: 9.2 KB
  • 大小: 12.2 KB
  • 大小: 12.4 KB
  • 大小: 3.6 KB
  • 大小: 7.9 KB
  • 大小: 7.9 KB
  • 大小: 3.6 KB
  • 大小: 11.8 KB
  • 大小: 1.5 KB
  • 大小: 11 KB
  • 大小: 1.4 KB
  • 大小: 16.2 KB
  • 大小: 12.5 KB
1
1
分享到:
评论
1 楼 kimmking 2012-12-25  
好文章,STOMP1.2已经release了。

相关推荐

    基于SpringBoot与STOMP协议开发的web聊天室源码+项目说明.zip

    基于SpringBoot与STOMP协议开发的web聊天室源码+项目说明.zip 基于SpringBoot+STOMP协议实现的web聊天室 目录 环境 部署 Linux & Windows 创建目录并授权 修改应用地址 修改百度地图API 编译运行 功能 登入 发送...

    从 0 开始带你成为消息中间件实战高手.rar

    2. 协议:如AMQP(Advanced Message Queuing Protocol)、MQTT(Message Queuing Telemetry Transport)和STOMP(Simple Text Oriented Messaging Protocol)等,它们定义了消息的格式和交换规则。 三、常见消息...

    RabbitMQ实战高效部署分布式消息队列.pdf+rabbitmq学习手册.pdf

    - **多种协议支持**:除了AMQP外,还支持STOMP、MQTT等多种消息协议。 - **多语言客户端**:提供了丰富的编程语言客户端,包括Java、Python、Ruby、JavaScript等。 - **灵活的路由与负载均衡**:通过自定义交换机...

    2019实战ActiveMQ集群与应用实战视频教程

    - 支持多种协议,如 AMQP、STOMP、MQTT 等。 - 提供持久化存储选项,包括 KahaDB 和 LevelDB。 - 可以通过 JMS API 或其他语言的客户端库进行访问。 #### 2. ActiveMQ 集群架构 - **集群优势**: - 提高可用性...

    ActiveMQ实战(英文版)

    3. **多种协议支持**:除了JMS,ActiveMQ还支持STOMP、AMQP、OpenWire、MQTT等多种消息协议,这使得ActiveMQ能与各种不同语言和环境的应用程序集成。 4. **高可用性**:ActiveMQ可以通过集群和复制实现高可用性,...

    activemq实战

    - **Apache ActiveMQ** 是一个开源的消息中间件,支持多种消息传递协议(如AMQP、STOMP等),并提供高性能、高可用性的消息服务。 - **背景**:在分布式系统中,通过消息中间件实现组件间的解耦是非常重要的设计模式...

    springboot+websocket进度条实战

    在上述代码中,我们启用了STOMP(简单文本面向消息协议)作为WebSocket的协议,并设置了消息代理以及客户端连接的端点。 接下来,我们需要创建一个服务端的WebSocket处理器,用于发送进度更新。这个处理器可能包含...

    Spring Boot 系列实战合集.zip

    此外,你还将接触到 Spring Boot 如何与其他技术栈结合,如 Docker 容器化部署、Spring Cloud 微服务架构、WebSocket 实现实时通信、WebSocket 与 STOMP 协议结合等。通过深入学习和实践,你可以提升自己在企业级 ...

    SpringClode分布实战项目视频

    RabbitMQ 是一个开源的消息代理软件(亦称消息队列),支持多种消息协议,如 AMQP、XMPP 和 STOMP 等。它提供了可靠的、基于发布/订阅模型的消息传递服务,非常适合在分布式系统中作为消息中间件使用。 ##### 3.2 ...

    Java EE 开发的颠覆者 Spring Boot 实战源码

    8. **WebSocket**:Spring Boot 可以支持 WebSocket 实现实时通信,如 STOMP 协议。 9. **Internationalization (i18n)**:处理多语言支持,使用 MessageSource 和 LocaleResolver。 10. **Testing**:Spring Boot ...

    分布式中间件.zip

    2. **多协议支持**:除了AMQP外,还支持STOMP、MQTT等多种协议,满足不同场景的需求。 3. **多种消息模式**:支持点对点、发布/订阅等多种消息传递模式,适应不同的业务需求。 4. **插件系统**:丰富的插件库,如...

    精通Spring 4.x 企业应用开发实战高清版

    书中会介绍如何配置WebSocket端点,以及使用STOMP协议进行消息传递,这对于构建现代Web应用至关重要。 此外,Spring MVC是Spring框架中的Web层,用于构建高性能的Web应用程序。书中会详细介绍模型-视图-控制器架构...

    基于消息中间件的学习记录以及源码示例【JMS、AMQP、ActiveMQ、RocketMQ】.zip

    3. AMQP协议的路由规则和RabbitMQ的实战应用。 4. ActiveMQ的配置、管理及客户端使用。 5. RocketMQ的架构设计、特性和最佳实践。 6. 分布式事务处理和消息可靠性保证。 7. 高并发和高可用性的实现策略。 通过上述...

    私塾在线 高级java软件架构师实战培训视频教程 阶段一 代码及目录 73-78 讲 共148讲

    除了标准的TCP/IP,ActiveMQ还支持多种传输协议,如Stomp、OpenWire、AMQP等。这些协议的不同特性会影响性能、兼容性和安全性。课程可能会讨论在不同场景下选择合适协议的策略。 最后,第78节涉及了ActiveMQ消息...

    spring boot ActiveMQ学习练习demo项目源码

    而ActiveMQ则是Apache提供的一个高性能、可靠的JMS服务器,支持多种协议,如OpenWire、STOMP、AMQP、MQTT等。 在Spring Boot项目中集成ActiveMQ,我们通常会添加相关的依赖到`pom.xml`文件,比如`spring-boot-...

    SpringWebSocket Demo

    - `@EnableWebSocketMessageBroker`:这个注解开启WebSocket消息代理,允许使用STOMP(Simple Text Oriented Messaging Protocol)作为子协议。 - `WebSocketMessageBrokerConfigurer`:配置WebSocket消息代理,包括...

    activeMQ实战demo

    ActiveMQ作为JMS的实现,提供了多种协议支持,包括开放的AMQP、STOMP、MQTT和WebSocket,使得非Java应用也能轻松集成。 在ActiveMQ实战demo中,我们通常会经历以下几个步骤: 1. **安装与配置ActiveMQ**:下载并...

    Spring 5 Recipes A Problem-Solution Approach.zip

    书中会介绍如何配置WebSocket服务器、使用STOMP协议进行消息传递。 10. **测试**:Spring提供了全面的测试支持,包括单元测试、集成测试和端到端测试。学习者将学习如何使用`@RunWith(SpringRunner.class)`、`@...

    ACTIVEMQ实战 部分翻译(1——4.3)

    ActiveMQ是一种广泛使用的企业级消息中间件,它遵循JMS(Java ...对于希望深入学习ActiveMQ的开发者来说,理解其安装、配置以及与不同系统的集成方式是十分必要的,这将有助于他们构建更加健壮和可扩展的应用程序。

    分布式中间件技术实战:基于springboot集成redis,mysql,activemq,-component.zip

    ActiveMQ是Apache出品的一款开源的消息中间件,支持多种消息协议,如AMQP、STOMP等。在SpringBoot中,我们可以通过Spring的JMS模块集成ActiveMQ。首先,添加ActiveMQ客户端依赖,接着配置连接工厂和目的地(队列或...

Global site tag (gtag.js) - Google Analytics