JMS消息服务 API解析

  JMS(Java Message Service)消息服务,具体详解请参看系列文章第一张,JMS的原理其实很简单,用过JDBC,可能理解JMS更加容易,JMS只提供API定义,具体由不同厂商或产品实现,如:AactiveMQ、Tomcat JMS、Weblogic JMS,实现可能存在差异,但应用完全遵照API定义。

  JMS API可以分为3个主要部分:公共API、点对点API和发布/订阅API。以下列举发送和接收JMS消息的有关接口:

公共API 点对点API 发布/订阅API 并发 API描述
ConnectionFactory QueueConnectionFactory TopicConnectionFactory Connection生产工厂,可以使用JNDI从提供者处获得。
Destination Queue Topic 可以使用JNDI从提供者处获得。
Connection QueueConnection TopicConnection 使用ConnectionFactory创建Connection,通常,一个应用程序只会有一个Connection对象。
Session QueueSession TopicSession 保存着用于消息传送的事务性工作单元,使用Connection创建Session,通常,一个应用程序可以由多个Session对象。
Message Message Message - 消息载体。
MessageProducer QueueSender TopicPublisher 消息生产者处理工作单元。
MessageConsumer QueueReceiver TopicSubscriber 消息消费者处理工作单元。

  JMS消息由消息头、属性和不同类型的消息有效负载组成。

  **消息头:**消息头提供了和消息有关的元数据,描述了消息创建者、创建时间、数据有效程度等信息。

消息头名称 方法 消息头描述
JMSDestination getJMSDestination()
setJMSDestination(…)
使用一个Queue或Topic对象来标识目的地,二者都是Destination类型。
JMSDeliveryMode getDeliveryMode()
setDeliveryMode(…)
JMS中,传送模式有两种:持久性模式和非持久性模式。持久性模式保证消息“一次且仅一次”,非持久性消息不对消息的送达做任何保证,主要原因在于JMS提供者出现故障时,消息的处理方式。
JMSMessageID getJMSMessageID()
setJMSMessageID(…)
消息标识,标识消息的唯一性字符串。
JMSTimestamp getJMSTimestamp()
setJMSTimestamp(…)
由MessageProducer在调用send()操作时自动设置。它包含的是JMS提供者接收消息的时间,而不是该消息的实际传送时间。
JMSExpiration getJMSExpiration()
setJMSExpiration(…)
Message有效期 ,用来防止把过期的消息传给消费者,可以用这个消息头来设置某条消息的有效期。消息发出前设置有效。
JMSRedelivered getJMSRedelivered()
setJMSRedelivered(…)
表示可能客户端之前发送过该消息,但是没有接收到确认通知,则设置JMSRedelivered=true并进行传输。
JMSPriority getJMSPriority()
setJMSPriority(…)
消息生产者通过该消息头分配一个优先级。优先级共有两类:04为普通优先级,59为加急优先级。JMS提供者不严格要求按照优先级发送消息,但是必须保证加急消息要先于普通消息。默认是4级。
JMSReplyTo getJMSReplyTo()
setJMSReplyTo(…)
应答目的地,类型为Destination。通过设置此消息头,消息生产者期望消息消费者对消息进行应答,并将消息放入指定消息目的地。
JMSCorrelationID getJMSCorrelationID()
setJMSCorrelationID(…)
通过该消息头,用于将当前消息与已存在的某条消息或应用程序的特性ID关联起来。通常情况下,JMSCorrelationID用于将一条消息标记为对应JMSMessageID标识的上一条消息的应答。
JMSType getJMSType()
setJMSType(…)
标识消息结构和负载类型,可选消息头。用于标识消息结构和有效负载类型。注意:这个消息头并未指明被发送的消息类型(MapMessage、TextMessage等),而是JMS提供者使用的内部消息仓库中的一个条目。主要用于非JMS客户端与JMS提供者进行消息交换时使用。

  消息属性:

​  消息属性是附加在消息传输过程中的消息头,可以用于消息过滤使用。Message接口提供了针对String、byte、int、short、long、float、double、boolean、Object类型。消息属性有三种类型:应用程序特定的属性、JMS定义的属性和提供者特定的属性。

属性类型 相关方法 属性描述
应用定义属性 setStringProperty(…, …)
setIntProperty(…, …)
setShortProperty(…, …)
setLongProperty(…, …)
setFloatProperty(…, …)
setDoubleProperty(…, …)
setBooleanProperty(…, …)
setObjectProperty(…, …)
clearProperties()
getPropertyNames()
由开发者确认在消息传递时加入各种属性,属性KEY和VALUE可任意定义。设置属性API:Message.setStringProperty(“xxxxx”, “xxxxx”),除了setStringProperty针对String、byte、int、short、long、float、double、boolean、Object这七种类型都有与之对应的API方法。消息发出后,属性只读,不可更改。不过,通过调用clearProperties(),可以修改的属性。getPropertyNames()用于获取该消息所有属性的枚举。
JMS定义属性 setInitProperty(…, …) JMS定义属性与应用定义属性特性相同。JMS定义属性大部分由JMS提供者来设置,可作为可选消息头,提供的JMS定义属性:JMSXUserID、JMSXAppID、JMSXProducerTXID、JMSXConsumerID、JMSXRcvTimestamp、JMSXDeliveryCount、JMSXState、JMSXGroupID、JMSXGroupID、JMSXGroupSeq。
提供者定义属性 JMS_ 每个JMS提供者都可以在自定义一组私有属性。使用方法其方式类似。

  消息确认机制:

  消息消费者在接收消息后,需要设置消息的确认模式,以反馈给JMS提供者。确认机制共分三种:

确认机制 机制描述
AUTO_ACKONWLEDGE JMS消费者在接收每条消息后自动确认。
DUPS_OK_ACKONWLEDGE 允许重复消息,对重复接收同一条数据要求不严格时,可以选用此模式
CLIENT_ACKONWLEDGE JMS消费者在收到每条消息后需要显示确认。

  在基于遵循JMS标准的提供者进行系统通信时,主要涉及到以上几大部分内容。对于这几部分API的含义和使用需要比较熟练,在JMS应用中才会如鱼得水。

猜你喜欢

转载自blog.csdn.net/securitit/article/details/106654112