第 8 章 消息交付
8.1. 处理未确认的发送 复制链接链接已复制到粘贴板!
消息传递系统使用消息确认来跟踪消息的目标是否真正完成。
发送消息后,在邮件被发送并被确认前有一个时间段(消息为"in flight")。如果此时丢失网络连接,消息交付的状态未知,发送可能需要在应用程序代码中特殊处理,以确保其完成。
以下小节描述了连接失败时消息交付的条件。
非转换生成者带有未确认的发送
如果消息在 flight 中,它会在重新连接后再次发送,只要未设置发送超时,且尚未设置。
不需要用户操作。
带有未提交事务的 transacted producer
如果消息在 flight 中,它会在重新连接后再次发送。如果发送是新事务中的第一个,则在重新连接后发送将继续正常。如果以前的事务中发送,则事务被视为失败,后续提交操作都会引发 TransactionRolledBackException。
为确保发送,用户必须重新发送属于失败事务的任何消息。
带有待处理提交的 transacted producer
如果提交处于 flight,则事务被视为失败,后续提交操作都会引发 TransactionRolledBackException。
为确保发送,用户必须重新发送属于失败事务的任何消息。
非转换的消费者,带有未确认的发送
如果收到消息但尚未确认,则确认消息不会产生任何错误,但不会给客户端产生任何操作。
由于收到的消息没有被确认,因此生成者可能会重新发送它。为避免重复,用户必须根据消息 ID 过滤出重复的消息。
带有未提交事务的 transacted consumer
如果还没有提交活动事务,它将被视为失败,并丢弃任何待处理的确认。任何后续提交操作都会抛出 TransactionRolledBackException。
生产者可能会重新发送属于事务的消息。为避免重复,用户必须根据消息 ID 过滤出重复的消息。
使用待处理的提交转换消费者
如果提交处于 flight,则事务将被视为失败。任何后续提交操作都会抛出 TransactionRolledBackException。
生产者可能会重新发送属于事务的消息。为避免重复,用户必须根据消息 ID 过滤出重复的消息。