JMS基本概念
JMS 是 SUN 公司开发的一套访问 MOM(Message-Oriented-Middleware) 消息服务中间件的标准 API。
MOM 提供消息接收和转发的服务,对消息进行缓存和持久操作,保证消息的安全性,JMS让开发都无须了解远程过程调用的细节和网络通信协议的细节就可以通过JMS向MOM发送消息,借助消息我们可以松散耦合的方式集成不同的应用。
JMS(Java Message Service)即Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业应用的开发。它支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。P2P 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者。
- 对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取,一旦这个消息被一个接收者读取之后,它就在这个Queue中消失了,所以一个消息只能被一个接收者消费。
- 与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。
点对对点消息传递域的特点:
- 每个消息只能有一个消费者;
- 消息的生产者和消费者之间没有时间上的相关性。无论消费者在生产者发送消息的时候是否处于运行状态,它都可以提取消息。
- 每个消息可以有多个消费者;
- 生产者和消费者之间有时间上的关联性。订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS规范允许客户创建持久阅读,这在一定程度上放松了时间上的相关性要求。持久订阅允许消费者消费它在未处于激活状态时发送的消息。
几个概念
- Destination——消息发送的目的地,也就是前面说的Queue和Topic。创建好一个消息之后,只需要把这个消息发送到目的地,消息的发送者就可以继续做自己的事情,而不用等待消息被处理完成。至于这个消息什么时候,会被哪个消费者消费,完全取决于消息的接受者。
- Connection——与JMS提供者(IBM Webshphere MQ, ActiveMQ等)建立的一个连接。可以从这个连接创建一个会话,即Session。
- ConnectionFactory——那如何创建一个Connection呢?ConnectionFactory。通过这个工厂类就可以得到一个与JMS提供者的连接,即Conection。
- Session——与JMS提供者所建立的会话,通过Session我们才可以创建一个Message。
- Producer——消息的生产者,要发送一个消息,必须通过这个生产者来发送。
- MessageConsumer——与生产者相对应,这是消息的消费者或接收者,通过它来接收一个消息。
- Message——从字面上就可以看出是被发送的消息。它有下面几种类型:StreamMessage:Java 数据流消息,用标准流操作来顺序的填充和读取。MapMessage:一个Map类型的消息;名称为 string 类型,而值为 Java 的基本类型。TextMessage:普通字符串消息,包含一个String。ObjectMessage:对象消息,包含一个可序列化的Java 对象BytesMessage:二进制数组消息,包含一个byte[]。XMLMessage: 一个XML类型的消息。最常用的是TextMessage和ObjectMessage。
- JMS 事务——JMS 使用 Session 控制事务 , 如何需要事务可以在创建 Session 时标注需要事务。
消息的消费可以采用以下两种方法之一:
- 同步消费——通过调用消费者的receive方法从目的地中显式地提取消息。receive方法可以一直阻塞到消息到达;
- 异步消费——客户可以为消费者注册一个消息监听器,以定义在消息到达时所采取的动作。
- PERSISTENT——指示JMS provider持久保存消息,以保证消息不会因为JMS provider的失败而丢失。
- NON_PERSISTENT——不要求JMS provider持久保存消息。
JMS消息只有在被确认之后,才认为已经被成功消费。消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息被确认。
在事务性会话中,当一个事务被提交时,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参数有以下三个可选值:
- Session.Auto_ACKNOWLEDGE。当客户成功地从receive方法返回的时候,或者从MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。
- Session.CLIENT_ACKNOWLEDGE。客户通过消息的acknowledge方法确认消息。需要注意的是,在这种模式中,确认是在会话层进行:确认一个被消费的消息将自动确认所有已被会话消费的消息。例如,如果一个消息消费者消费了10个消息,然后确认第5个消息,那个所有10个消息都被确认。
- Session.DUPS_ACKNOWLEDGE。在会话迟钝等情况下确认消息。如果JMS provider失败,那么可能会导致一些重复的消息。如果是重复的消息,那么JMS provider必须把消息头的JMSRecelivered字段设置为true。
JMS程序需要基本步骤
- 通过 JNDI 查找 ConnectionFactory
- 通过 ConnectionFactory 创建一个 Connection
- 用 Connection 创建一个或者多个 Session
- 通过 JNDI 查询一个或多个 Destination
- 用 Session 和 Destination 创建对应的 MessageProducer 或 MessageConsumer
- 启动 Conneciton
- 发送或接收消息