ActiveMQ--事务、签收

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)。

发布了641 篇原创文章 · 获赞 1877 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/cold___play/article/details/104056701