目录
在通过Connection创建Session的时候我们可以通过传参的方式指明这个Session下的消息生产者和消息消费者是否以事务的方式发送和消费消息:
//第一个参数控制事务:true-以事务的方式发送消息 false-以非事务的方式发送消息
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
这里说的事务其实和JDBC中的事务是一个概念,都是将事务中的操作作为一个原子的整体,要么一次性全部提交,要么全部回滚。
以事务的方式和以非事务的方式发送和消费消息的不同之处在于:
- 以事务的方式发送和消费消息,需要显示的提交(session.commit())和回滚事务(session.callback()),在事务未提交完成之前mq里是不会出现消息的。
- 以非事务的方式发送和消费消息则不需要显示提交事务(此时不存在回滚),此时所做的每一步操作都是直接提交生效的(因此不存在回滚)。
- 举例来说:
- 对于生产者而言,若以事务的方式发送消息到MQ服务器,则在未执行事务提交操作之前在MQ服务器中是看不到消息的,要等到执行提交动作时将整个事务中的操作作为一个原子操作一次性提交后才能看到消息,也就是说事务不提交生产的消息不会发送;
- 对于消费者而言,若以事务的方式消费消息,则在未提交事务之前相当于消息未消费,只有事务提交了才认为消息被消费了,因此在消费者端若以事务的方式消费消息而未将事务提交时(比如事务提交之前出现了异常)就会存在消息的重复消费问题。