JMS / Active MQ - 代理与消费者重新传递

时间:2014-08-29 13:32:44

标签: jms activemq message-queue

据我了解(http://activemq.apache.org/message-redelivery-and-dlq-handling.html),可以由消费者或经纪人进行重新发送。 我有一些问题:

消费者的重新传递如何在底层工作?消费者是否从代理缓存消息并在本地重新发送?如果消费者在中间终止会发生什么?这样的消息会丢失吗?我认为只要消费者不承认这个消息就不应该。但在这种情况下,该消息仍可在经纪人处获得吗?

是否有使用经纪人与消费者重新兑换的指导方针?有什么建议吗?

1 个答案:

答案 0 :(得分:3)

消费者会在本地缓存并重新发送消息给客户端,直到满足重新发送计数,然后自动将消息视为坏消息(posin ack)。消费者可以根据确认模式控制是否将其标记为已重新传送。如果无论出于何种原因,消费者不能或不想处理消息,它也可以将其反馈,如果它关闭会话,它将再次被消费。

经纪人将保留该消息,直到它从消费者那里得到一个确认。如果您的消费者设置为AUTO_ACKNOWLEDGE,那么如果发生未处理的异常或消费者意外结束,您可能会丢失消息。

否则,如果您的消费者正在使用事务或CLIENT_ACKNOWLEDGE,它将为您提供何时发生的控制。

对于交易,如果消费者在提交之前下降,则可供下一个消费者或消费者重新连接时使用。

我总是使用CLIENT_ACKNOWLEDGE上的事务,所以我不想确定如果在消费者关闭之前没有调用Session.recover(),消息将会丢失。

从消费者的角度来看,这也称为重试逻辑。

关于代理与消费者重新传递:默认情况下,代理只是在满足重新传递计数之前不断向消费者提供相同的消息。如果您告诉经纪人在给定的时间后不再重新发送,那么您的消费者可以继续消费其他可能被处理的消息。

何时这样做取决于您的应用程序中发生的事情。也许需要将特定的消息放到数据库中,并且该数据库目前不可用,并且您希望转到其他地方/有其他目的的消息?