JMS的可靠机制主要表现在 消息的消费!
但是我希望从消息的生产开始说起!
生产者
消息的生产发送可靠性通过session来维持
再创建session时我们可以选择事物或非事物
1.值得注意的是,单我们处于生产者时,无论我们选择事物,还是非事物,另一个参数(acknowledgeMode)都毫无意义!
2.当我们选择事物的时候, acknowledgeMode没有意义可以下瞎写,
此时当我们session.commit时,在这个时间点之前的通过该session存储在内存的消息将全部发送
3.当我们选择非事物时候,acknowledgeMode必须是Session.xxxx中的值,但是没有意义,因为无论我们是否确认,每次send都会发送消息!
4.理解
- 当我们选择事物时,效率相对提高,但是这种时候,我们rollback的代价也相对提高,所以我们可以每发送N条,commit一次,这样对内存空间的要求会降低,但是一旦出现需要exception,那么我们无法全部rollback!
- 当我们选择非事物是,不存在rollback的情况,发送一条就是一条,当然发送的效率相对较低,需要多次连接数据库
消费者
消费者保持事物也同样是session的层面开始!
再创建session时我们可以选择事物或非事物
1.如果支持事物的话
- acknowledgeMode无效
- 当我们session.commit时,自动确认已经消费的信息
2.如果不支持事物
- acknowledgeMode= Session.AUTO_ACKNOWLEDGE,
当客户成功的从 receive 方法返回的时候或者从 MessageListener.onMessage 方法成功返回的时候,会话自动确认
客户收到的消息 - acknowledgeMode= Session.AUTO_ACKNOWLEDGE
Session.CLIENT_ACKNOWLEDGE。客户通过消息的 acknowledge 方法确认消 息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被 消费的消息将自动确认所有已被会话消费的消息。例如,如果一个消息消费者消费了 10 个消息,然后确认第 5 个消息,那么所有 10 个消息都被确
认。