本文转自

一、JMS

通常而言提到JMS(Java MessageService)实际上是指JMS API。JMS是由Sun公司早期提出的消息标准,旨在为java应用提供统一的消息操作,包括create、send、receive等。JMS已经成为Java Enterprise Edition的一部分。从使用角度看,JMS和JDBC担任差不多的角色,用户都是根据相应的接口可以和实现了JMS的服务进行通信,进行相关的操作。
JMS所包含的角色:

JMS提供了两种消息模型:
peer-2-peer(点对点)以及publish-subscribe(发布订阅)模型。

  • 当采用点对点模型时,消息将发送到一个队列,该队列的消息只能被一个消费者消费。而采用发布订阅模型时,消息可以被多个消费者消费。

  • 在发布订阅模型中,生产者和消费者完全独立,不需要感知对方的存在。消息如何从producer端达到consumer端由message-routing来决定。在JMS中,消息路由非常简单,由producer和consumer链接到同一个queue(p2p)或者topic(pub/sub)来实现消息的路由。JMSconsumer同时支持message selector(消息选择器),通过消息选择器,consumer可以只消费那些通过了selector筛选的消息。

在JMS中,消息路由机制的图示如下:

常见的消息队列,大部分都实现了JMS API,可以担任JMS provider的角色,如ActiveMQ,Redis。

  • JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
  • StreamMessage – Java原始值的数据流
  • MapMessage–一套名称-值对
  • TextMessage–一个字符串对象
  • ObjectMessage–一个序列化的 Java对象
  • BytesMessage–一个字节的数据流

二、AMQP(可跨平台)

AMQP(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领域不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的(跨平台指的是windows linux macos之间。jms基于java, java跨平台,所以jms是platform independent的)。意味着我们可以使用Java的AMQP provider,同时使用一个python的producer加一个rubby的consumer。从这一点看,AQMP可以用http来进行类比,不关心实现的语言,只要大家都按照相应的数据格式去发送报文请求,不同语言的client均可以和不同语言的server链接。

在AMQP中,消息路由(messagerouting)和JMS存在一些差别,在AMQP中增加了Exchange和binding的角色。producer将消息发送给Exchange,binding决定Exchange的消息应该发送到那个queue,而consumer直接从queue中消费消息。queue和exchange的bind由oconsumer来决定。AMQP的routing scheme图示过程如下:

目前AMQP逐渐成为消息队列的一个标准协议,当前比较流行的rabbitmq就使用了AMQP实现。

三、JMS和AMQP的各项对比

  • 总结:

AMQP 为消息定义了线路层(wire-level protocol)的协议,而JMS所定义的是API规范。在 Java 体系中,多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差而AMQP天然具有跨平台、跨语言特性。JMS 支持TextMessage、MapMessage 等复杂的消息类型;而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)。由于Exchange提供的路由算法,AMQP可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持 队列 和 主题/订阅 方式两种。

四、常见消息队列对比

消息队列之JMS和AMQP对比相关推荐

  1. 消息队列MQ/JMS/Kafka,你都了解吗?

    点击关注公众号,回复"1024"获取2TB学习资源! 是不是平常听到说消息队列啊,JMS啊,MQ啊 .kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都 ...

  2. 梳理消息队列 MQ/JMS/Kafka

    是不是平常听到说消息队列啊,JMS啊,MQ啊 .kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧. 1消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把 ...

  3. 消息队列MQ/JMS/Kafka,你都了解多少?

    今日推荐isEmpty 和 isBlank 的用法区别,你都知道吗?SpringBoot项目优化和Jvm调优(楼主亲测,真实有效)国内大神成功给手机装上了 Win11,代码已开源!Fluent Myb ...

  4. 后端技术:消息队列MQ/JMS/Kafka相关知识介绍

    ?今天给大家分享消息队列MQ/JMS/Kafka相关知识介绍 1.消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把我们的快递送到我们的手里.他需要什么条件嗯? 快递小哥有时间送, 我们有时 ...

  5. 面试官:消息队列 MQ/ JMS/ Kafka 有什么区别?

    更多架构干货请关注公众号"架构之路".是不是平常听到说消息队列啊,JMS啊,MQ啊 .kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧. 1消 ...

  6. MQ消息队列的JMS规范和AMQP协议的区别

    详细介绍了JMS规范和AMQP协议的内容与区别. 文章目录 1 JMS 1.1 JMS消息模型 2 AMQP 2.1 AMQP消息模型 3 对比 1 JMS JMS(JAVA Message Serv ...

  7. Java常用消息队列原理介绍及性能对比

    消息队列使用场景 为什么会需要消息队列(MQ)? 解耦  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一 ...

  8. 轻松搞定RabbitMQ开篇:Java消息队列与JMS的诞生

    Java 帝国之消息队列 原创: 刘欣 码农翻身 2017-02-06 张家村的历史 Java 帝国的张家村正在迎来一次重大的变革. 5年前网上购物兴起的时候, 帝国非常看好, 决定向这个领域进军, ...

  9. Java消息队列与JMS的诞生

    Java 帝国之消息队列 Java帝国之JMS的诞生 原创: 刘欣 码农翻身 2017-02-06 张家村的历史 Java 帝国的张家村正在迎来一次重大的变革. 5年前网上购物兴起的时候, 帝国非常看 ...

最新文章

  1. 12c expdp ORA-31623 -又遇到BUG
  2. Docker无法连接到docker守护程序
  3. unity menuitem_Unity热更_打AssetBundles包
  4. java(eclipse)和数据库(mysql)的连接
  5. Linux本地yum源配置以及使用yum源安装gcc编译环境
  6. 【ArcGIS微课1000例】0009:ArcGIS影像拼接(镶嵌、镶嵌至新栅格)
  7. centos7安装openjdk8
  8. OJ1009: 求平均分
  9. Python操作ElasticSearch条件查询
  10. python机器学习库sklearn——交叉验证(K折、留一、留p、随机)
  11. Oracle 11g完全卸载(Windows)
  12. 菜鸟学Linux 第030篇笔记 yum使用,源码编译安装
  13. 可视化报表Superser
  14. 说说年度补税退税的问题
  15. 用xslt 把xml转换成html的几个实例(1)
  16. 一个操作共享内存的类!可以方面的添加,删除数据,包括各种结构体!
  17. 华为服务器voip处理性能,voip云服务器注册状态
  18. Git ssh key的生成,由于SSH配置文件的不匹配,导致的Permission denied (publickey)及其解决方法
  19. !! A股历史平均市盈率走势图
  20. 《鸟哥的Linux私房菜 基础学习篇(第三版)》习题与解析(一)

热门文章

  1. 浅入深出Vue:文章编辑
  2. linux下的ps命令
  3. Laravel中构造方法中不能写return!!!
  4. JAVA作业 02 JAVA语法基础
  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(73)-微信公众平台开发-消息管理
  6. 数据库连接字符串.udl
  7. 何时使用hadoop fs、hadoop dfs与hdfs dfs命令
  8. 读《程序设计实践》之一 风格
  9. 浅谈ICA算法的概念、本质和流程
  10. 工预-Typora(A)