ActiveMQ的事务
生产者事务:
事务在connection.createSession(false, Session.AUTO_ACKNOWLEDGE);中设置。
-
false:
- 只要执行send(),就进入到消息队列
- 关闭事务,那么第二个签收参数的设置需要有效。
-
true:
- 先执行send()再执行session.commit(),消息才被真正提交到队列中。
- 消息需要批量发送,需要缓冲区处理。
- 如果事务失败,可以执行session.rollback()回滚事务
消费者事务:
- false: 一条一条消费,消费一条少一条
- true: 以事务为单位消费,注意:一定要记得commit(),否则会出现消息的重复消费问题!
签收(ACKNOWLEDGE)
-
非事务签收
-
自动签收(默认)AUTO_ACKNOWLEDGE:
-
手动签收 CLIENT_ACKNOWLEDGE:客户端调用acknowledge()方法手动签收
需要消费者手动签收:
如果不进行手动签收,会发生消息重复消费的问题! -
允许重复消息 DUPS_OK_ACKNOWLEDGE:
-
-
事务级签收
在事务开启的状态下,只有session.commit()后才能将全部消息变为已消费。如果不进行commit(),采用手动签收的方式,消息依然不会签收,会发生消息重复消费的问题。
事务和签收的关系:
在事务性会话中,当一个事务被成功提交则消息被自动签收。如果事务回滚,则消息会被再次传送。
非事务性会话中,消息何时被确认取决于创建会话时的应答模式(ACKNOWLEDGE)。