第 8 章 消息发送
8.1. 处理未确认的交付
消息传递系统使用消息确认来跟踪发送消息的目标是否真正实现。
发送邮件时,发送邮件之后和确认之前有一段时间(消息为"在机中")。如果在这段时间内丢失网络连接,消息发送的状态未知,并且传输可能需要在应用代码中特殊处理以确保完成。
以下小节描述了连接失败时消息发送的条件。
不经过翻译且交付未经确认的生产者
如果邮件处于运行状态,会在重新连接后再次发送,只要未设置发送超时且未通过。
不需要用户操作。
有未提交的事务的转译制作者
如果邮件处于转机状态,则在重新连接后再次发送。如果发送是新事务中的第一个,则在重新连接后发送会正常进行。如果之前发送了事务,则事务被视为失败,且任何后续的提交操作都会抛出 TransactionRolledBackException
。
为确保发送,用户必须重新发送属于失败事务的任何消息。
带有待处理的提交进行转换的制作者
如果提交处于机状态,则事务被视为失败,且任何后续的提交操作都会抛出 TransactionRolledBackException
。
为确保发送,用户必须重新发送属于失败事务的任何消息。
带有未经确认的交付的非已传输消费者
如果收到消息但尚未确认,则确认消息不会生成任何错误,但不会导致客户端不执行任何操作。
由于收到的消息未被确认,生产者可能会重新发送消息。为避免重复,用户必须通过消息 ID 过滤掉重复的消息。
带有未提交交易的转换消费者
如果一个活跃的事务尚未提交,它将被视为失败,任何待处理的确认都会被丢弃。任何后续提交操作都会抛出 TransactionRolledBackException
。
生产者可能会重新发送属于该事务的消息。为避免重复,用户必须通过消息 ID 过滤掉重复的消息。
带有待处理的提交进行转换的消费者
如果提交正在进行,则该交易将被视为失败。任何后续提交操作都会抛出 TransactionRolledBackException
。
生产者可能会重新发送属于该事务的消息。为避免重复,用户必须通过消息 ID 过滤掉重复的消息。