本文共 2804 字,大约阅读时间需要 9 分钟。
本文的目录
- JMS简介;
- JMS消息传递模型;
- JMSAPI;
- 再谈JMS Message。
JMS简介
Java Message Service(JMS)即Java消息服务被作为JSR914开发,它定义了一组API为Java程序创建、发送、接收和读取企业消息系统的消息提供了一种常见的方式并且支持消息的同步及异步。
一个JMS程序一般由以下几个部分组成:
- JMS提供者(JMS Provider):实现JMS API的消息中间件(MOM),例如ActiveMQ;
- JMS客户(JMS Client):发送或接受消息的Java程序,例如程序中的生产者和消费者;
- 消息(Messages):在JMS客户间传递的消息对象,例如程序中生产者发送的消息,消费者接收的消息;
- 管理对象(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发布以来经历了三次更新。
- JMS1.0定义了上述的两种消息传递模型,当前官方已经不建议使用,1.0部分API存在的目的只是为了向后兼容解决历史遗留问题;
- JMS1.1(ActiveMQ基于JMS1.1开发)引入了统一的API用来实现两种类型的消息传递;
- JMS1.2(JDK7的时候提出)又针对JMS1.1中的接口进行了简化,其目的是为了通过更少的连接来更简单的实现消息的传递。
下面来简单介绍下JMS1.1以及JMS1.2API,首先看下两者共同的几个API:
- Message:Message是所有消息类型的超类接口对应的子接口有BytesMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。Message用来发送或者接收消息到JMS提供者,其中涉及到部分知识后文会再提到;
- Queue:Queue继承了管理对象中的目标Destination,用于存放点对点消息传递的对象;
- Topic:Topic继承了管理对象中的目标Destination,用于存放发布及订阅中的消息对象;
- Destination:管理对象的一种,它是Queue和Topic的超类。
接着看下两者不同的API,首先是JMS1.1规范:
- ConnectionFactory:管理对象的一种,用来创建Connection对象;
- Connection:用来在JMS客户跟JMS提供者之间进行连接;
- Session:用于发送和接收消息的单线程上下文;
- MessageProducer:由Session创建的对象,用来发送消息到队列或者主题;
- MessageConsumer:由Session创建的对象,用来接收发送到队列或者主题的消息。
JMS1.2规范:
- ConnectionFactory:管理对象的一种,用来创建用来创建JMSContext对象;
- JMSContext:用来连接JMS客户跟JMS提供者并且是用于发送和接受消息的单线程上下文。可以看到其就是简化了JMS1.1中的Connection和Session,把两者合并到了一起。
- JMSProducer:由JMSContext创建的对象,用来发送消息到队列或者主题;
- 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定义了五种类型的消息体:
- Stream:StreamMessage使用Java中的对象IO流,顺序写入和读取;
- Map:MapMessage包含一组键值对(name-value pairs),name是String,value为Java的基础类型或者String;
- Text:TextMessage包含一个String对象,也是比较经常使用的一种消息体;
- Object:ObjectMessage包含一个
Serializable
对象; - 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!