据我了解(http://activemq.apache.org/message-redelivery-and-dlq-handling.html),可以由消费者或经纪人进行重新发送。 我有一些问题:
消费者的重新传递如何在底层工作?消费者是否从代理缓存消息并在本地重新发送?如果消费者在中间终止会发生什么?这样的消息会丢失吗?我认为只要消费者不承认这个消息就不应该。但在这种情况下,该消息仍可在经纪人处获得吗?
是否有使用经纪人与消费者重新兑换的指导方针?有什么建议吗?
答案 0 :(得分:3)
消费者会在本地缓存并重新发送消息给客户端,直到满足重新发送计数,然后自动将消息视为坏消息(posin ack)。消费者可以根据确认模式控制是否将其标记为已重新传送。如果无论出于何种原因,消费者不能或不想处理消息,它也可以将其反馈,如果它关闭会话,它将再次被消费。
经纪人将保留该消息,直到它从消费者那里得到一个确认。如果您的消费者设置为AUTO_ACKNOWLEDGE,那么如果发生未处理的异常或消费者意外结束,您可能会丢失消息。
否则,如果您的消费者正在使用事务或CLIENT_ACKNOWLEDGE,它将为您提供何时发生的控制。
对于交易,如果消费者在提交之前下降,则可供下一个消费者或消费者重新连接时使用。
我总是使用CLIENT_ACKNOWLEDGE上的事务,所以我不想确定如果在消费者关闭之前没有调用Session.recover(),消息将会丢失。
从消费者的角度来看,这也称为重试逻辑。
关于代理与消费者重新传递:默认情况下,代理只是在满足重新传递计数之前不断向消费者提供相同的消息。如果您告诉经纪人在给定的时间后不再重新发送,那么您的消费者可以继续消费其他可能被处理的消息。
何时这样做取决于您的应用程序中发生的事情。也许需要将特定的消息放到数据库中,并且该数据库目前不可用,并且您希望转到其他地方/有其他目的的消息?