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应用中才会如鱼得水。