消息接收确认:
JMS消息只有在被确认之后, 才认为被成功消费了, 消息成功消费通常包含三哥阶段:客户接受消息, 可会处理消息和消息被确认/
在事务性会话中, 当一个事务被提交的时候, 确认自动发生. 在非事务性会话中,消息合适被确认取决于创建会话时的应答模式(acknowledge mode), 该参数有一下三个可选值:
Session.AUTO_ACKNOWLEDE: 当用户成功的从revceive方法返回的时候, 或者从MessageListener.onMessage方法返回成功的时候, 会话自动确认客户收到的消息'
Session.Client_Acknowledge' : 当客户通过调用消息的acknowledge方法确认消息, 需要注意的是, 确认是在session层面上确认的
Session.Dups_acknowledge: 会话迟钝的确认消息的提交, 如果 jms_provider失败, 那么会导致一些重复的消息, 如果是重复的消息, 那么JMS provider 必须把消息头的JMS Redelivered字段为true;
消息持久性: JMS支持以下两种消息提交模式
Persistent: 指示 JMS provider 持久保存信息, 以保证消息不会因为JMS provider的失败而丢失
NON_PERSISTENT: 不要求 jms provider 持久保存信息
本地事务: ... commit/ rollback 一旦被调用,本事务就结束, 另一个事务开始
注意: 如果使用请求/回复机制, 即发送一个消息, 同时希望在同一个事务中等待接受该消息的回复, 则程序将被挂起, 因为直到事务提交, 发送操作操作才会真正执行; 谨慎使用
JMS的PTP 模型
JMS PTP (point to point):模型定义了客户端如何向队列发送消息, 从队列接受消息, 以及浏览队列中的消息.
PTP的一些特点:
1. 如果在Session 关闭时, 有一些消息已经被收到, 但是还没有被签收(acknowledged),那么,当消费者下次连接到相同的队列时, 这些消息还会被再次接收
2. 如果用户在receive 方法中设定了消息选择条件, 那么不符合条件的消息会留在队列中, 不会被接收到
3. 队列可以长久的保存消息,直到消费者接收到消息, 消费者不需要因为担心消息会丢失而时刻与队列保持**的连接状态,充分体现了异步传输的优势
JMS的PUB/SUB
此模型定义了如何向一个内容节点发布和订阅消息, 这些节点被称作topic主题,可以被认为是消息的传输中介,发布者 发布消息到主题, 订阅者从主题中订阅消息. 主题使得消息订阅者和消息发布者, 保持相互独立, 不需要接触即可保证消息的传送.
特点:
1. 消息订阅分为非持久订阅和持久订阅
非持久订阅,只有当客户端处于**状态, 也就是和JMS provider 保持连接状态才能收到发送到某个主题的消息, 而当客户端处于离线状态, 这个时间段发送到主题的消息会丢失.
持久订阅时, 客户端向JMS注册一个识别自己身份的ID, 当这个客户端处于离线时,JMS provider会为这个ID保存所有发送主题的消息, 当客户再次连接到JMS Provider时, 会根据自己的ID得到所有当自己处于离线时发送到主题的消息.
2. 如果用户在recieve方法中设定了消息选择条件, 那么不符合条件的消息不会被接受
3. 非持久订阅的状态下, 不能恢复或重新派送一个未签收的消息, 只有持久订阅才能恢复或重新派送一个未签收的消息
4, 当所有消息必须被接受, 则使用持久订阅,. 当丢失消息能被容忍, 则使用非持久订阅
设置持久化!activemq.xml
(发送端)
订阅端