JavaEE之JMS规范
发布日期:2021-07-30 03:26:32 浏览次数:2 分类:技术文章

本文共 2804 字,大约阅读时间需要 9 分钟。

本文的目录

  1. JMS简介;
  2. JMS消息传递模型;
  3. JMSAPI;
  4. 再谈JMS Message。

JMS简介

  Java Message Service(JMS)即Java消息服务被作为JSR914开发,它定义了一组API为Java程序创建、发送、接收和读取企业消息系统的消息提供了一种常见的方式并且支持消息的同步及异步。

  一个JMS程序一般由以下几个部分组成:

  1. JMS提供者(JMS Provider):实现JMS API的消息中间件(MOM),例如ActiveMQ;
  2. JMS客户(JMS Client):发送或接受消息的Java程序,例如程序中的生产者和消费者;
  3. 消息(Messages):在JMS客户间传递的消息对象,例如程序中生产者发送的消息,消费者接收的消息;
  4. 管理对象(Administered objects):实现JMS客户跟JMS提供者之间进行交互的对象。JMS管理对象有两种,一种是连接工厂(ConnectionFactory)用来创建JMS客户跟JMS提供者之间连接的对象。另一种是目标(Destination)JMS客户用来指定它发送的消息的目的地和它接收的消息的来源。

 

JMS消息传递模型

  JMS支持两种类型的消息传递:

  • 点对点point-to-point (PTP):使用队列的点对点消息传递;

  • 发布订阅publish-and-subscribe (pub/sub):使用主题发布及订阅消息。

JMS API

  JMS提供了一系列的API接口存放在javax.jms包下面供第三方实现,从JSR914发布以来经历了三次更新。

  1. JMS1.0定义了上述的两种消息传递模型,当前官方已经不建议使用,1.0部分API存在的目的只是为了向后兼容解决历史遗留问题;
  2. JMS1.1(ActiveMQ基于JMS1.1开发)引入了统一的API用来实现两种类型的消息传递;
  3. JMS1.2(JDK7的时候提出)又针对JMS1.1中的接口进行了简化,其目的是为了通过更少的连接来更简单的实现消息的传递。

  下面来简单介绍下JMS1.1以及JMS1.2API,首先看下两者共同的几个API:

  1. Message:Message是所有消息类型的超类接口对应的子接口有BytesMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。Message用来发送或者接收消息到JMS提供者,其中涉及到部分知识后文会再提到;
  2. Queue:Queue继承了管理对象中的目标Destination,用于存放点对点消息传递的对象;
  3. Topic:Topic继承了管理对象中的目标Destination,用于存放发布及订阅中的消息对象;
  4. Destination:管理对象的一种,它是Queue和Topic的超类。

  接着看下两者不同的API,首先是JMS1.1规范:

  1. ConnectionFactory:管理对象的一种,用来创建Connection对象;
  2. Connection:用来在JMS客户跟JMS提供者之间进行连接;
  3. Session:用于发送和接收消息的单线程上下文;
  4. MessageProducer:由Session创建的对象,用来发送消息到队列或者主题;
  5. MessageConsumer:由Session创建的对象,用来接收发送到队列或者主题的消息。

 

  JMS1.2规范:

  1. ConnectionFactory:管理对象的一种,用来创建用来创建JMSContext对象;
  2. JMSContext:用来连接JMS客户跟JMS提供者并且是用于发送和接受消息的单线程上下文。可以看到其就是简化了JMS1.1中的Connection和Session,把两者合并到了一起。
  3. JMSProducer:由JMSContext创建的对象,用来发送消息到队列或者主题;
  4. JMSConsumer:由JMSContext创建的对象,用来接收发送到队列或者主题的消息。

  最后简单的介绍下前文提到的兼容JMS1.0中的部分API。在JMS1.0中针对两种消息传递模型分别定制了两套API分别用来实现各自的场景,从源码或者文档中可以看到以Queue开头的QueueConnectionFactory,QueueConnection等一套完整的API以及以Topic开头的同样一套完整的API来表示。但是现在因为被JMS1.1以及JMS1.2取代了。存在的意义前文已经提及,此处不再赘述。

再谈JMS Message

  JMS Message是整个JMS中重要的一个部分,在此将其拎出来详细的了解一下。因为当前市场上有许多的JMS提供者或者说是面向消息中间件(MOM)针对Message的定义各有差异,JMS为了更好的支持所有的产品的Message为此把它分成了三个部分Header,Properties ,Body 。

Message Body

  JMS API定义了五种类型的消息体:

  1. Stream:StreamMessage使用Java中的对象IO流,顺序写入和读取;
  2. Map:MapMessage包含一组键值对(name-value pairs),name是String,value为Java的基础类型或者String;
  3. Text:TextMessage包含一个String对象,也是比较经常使用的一种消息体;
  4. Object:ObjectMessage包含一个Serializable对象;
  5. Bytes:BytesMessage包含String或者原始类型字节。

Message Header

  header中字段JMSCorelationID用来链接回复消息跟请求消息。JMSCorelationID可以保存发送者的特定ID,这样就可以跟特定的响应程序作出关联。

Message Proerties

  JMS中的Message Properties主要是用来跟Selector选择器搭配使用的。它允许消费者消费满足自己需求的消息。假设有这么一个场景:商家(生产者)在商场中饮料所属的货柜上发了很多款的饮料(消息),作为客户(消费者)会查看饮料的名字跟类型等信息去选择自己喜欢的饮料。那么前文的名字跟类型对应的就是在JMS Producer发送消息前在Message Properties中指定,属性值可以是boolean,byte,short,int,long,float,double和String,主要是调用setXXProperty以及getXXProperty方法,下图是部分内容。

Message Selector

  消息选择器跟前文的属性Properties相对应,它支持的是SQL92,因此只要在创建JMS Consumer的时候添加满足SQL92的选择器,那么就可以实现消息过滤。

 

参考资料:

 

转载地址:https://blog.csdn.net/u010890358/article/details/84351050 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java IO详细总结(源码解析)
下一篇:Redis复制(Replication)和哨兵机制(Sentinel)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年02月29日 20时18分10秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java root权限_android java获得root权限调用linux命令 | 学步园 2019-04-21
java最小化窗体_JAVA窗体最大化最小化控制+托盘 2019-04-21
java 注解 数组默认值_Java注解默认值 2019-04-21
java流程语句_Java流程控制语句 2019-04-21
java require_java正则中的requireEnd和hitEnd 2019-04-21
400错误java_java代码转化成c#代码 报400错误 2019-04-21
java常见对象_Java 常见对象 02 2019-04-21
spring java配置_Spring Java配置要点 2019-04-21
共享内存 java_java - Java客户端-服务器编程:客户端之间的共享内存 - 堆栈内存溢出... 2019-04-21
java布局管理器空布局_Java图形化界面设计——布局管理器之null布局(空布局)... 2019-04-21
java gas station_LeetCode – 774. Minimize Max Distance to Gas Station 2019-04-21
java项目无法加载到tomcat_eclipse+tomcat添加项目进来无法启动tomcat 2019-04-21
后缀树建立 java_实用算法实现-第 8 篇后缀树和后缀数组 [2 最长公共子串] 2019-04-21
java网络编程期末试题_java网络编程面试题【其中一小部分】 2019-04-21
estore java_estore2 - WEB源码|JSP源码/Java|源代码 - 源码中国 2019-04-21
java如何做表单校验_微信小程序实现表单校验功能 2019-04-21
matlab dwt2(),MATLAB小波变换指令及其功能介绍(超级有用) 2019-04-21
php sequelize,egg.js整合数据库ORM框架Sequelize 2019-04-21
php同时打开2个数据库,thinkphp3.2同时连接两个数据库的简单方法 2019-04-21
centos 开发php扩展,centos 安装php扩展redis 2019-04-21