JMS/Active MQ-代理与消费者重新交付

JMS/Active MQ-代理与消费者重新交付,jms,activemq,message-queue,Jms,Activemq,Message Queue,据我所知()再交付可以由消费者或经纪人完成。 不过,我有一些问题: 消费者的再交付是如何运作的?消费者是否缓存来自代理的消息并在本地重新传递?如果消费者在两者之间终止,会发生什么?这样的信息会丢失吗?我认为,只要消费者不承认信息,就不应该这样。但是在这种情况下,消息在代理上仍然可用吗 在使用代理与消费者再交付时,是否有任何指导原则?有什么建议吗?消费者会缓存消息并在本地将其重新传送到客户端,直到满足重新传送计数,然后自动将消息确认为坏消息(posin ack)。消费者可以根据确认模式控制是否将其

据我所知()再交付可以由消费者或经纪人完成。 不过,我有一些问题:

消费者的再交付是如何运作的?消费者是否缓存来自代理的消息并在本地重新传递?如果消费者在两者之间终止,会发生什么?这样的信息会丢失吗?我认为,只要消费者不承认信息,就不应该这样。但是在这种情况下,消息在代理上仍然可用吗


在使用代理与消费者再交付时,是否有任何指导原则?有什么建议吗?

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

代理将保留该消息,直到它从消费者处获得ack。如果消费者设置为AUTO_ACKNOWLEDGE(自动确认),则如果发生未处理的异常或消费者意外结束,则可能会丢失消息

否则,如果您的消费者正在使用交易或客户确认,它将让您控制何时发生

对于事务,如果使用者在提交之前退出,则下一个使用者或该使用者重新连接时都可以使用它

我一直使用客户机上的transaction\u ACKNOWLEDGE,因此我不想说,如果在使用者停机之前未调用Session.recover(),消息是否会丢失

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

关于代理与消费者的重新交付:默认情况下,代理只是不断地向消费者提供相同的消息,直到满足重新交付计数。如果您告诉代理在给定的时间后不要重新传递它,那么您的消费者可以继续使用其他可能能够处理的消息


何时这样做实际上取决于应用程序中的情况。可能需要将特定消息放入数据库,而该数据库目前不可用,您希望转到其他地方/有其他用途的消息?

这并不完全正确。ActiveMQ MessageConsumer确实拥有事务中已传递消息的缓存,并将在本地重新传递这些消息,直到TX回滚时设置的重新传递限制。@TimBish感谢调用。我以为我已经编辑过了。我开始回复时考虑了其他一些问题。这是否意味着如果我们选择broker redelivery,那么消息不会缓存在消费者上,并且每次都来自broker(从而增加了网络使用率)?另一个问题:是否存在类似确认超时的情况,以便代理或使用者在一段时间后在没有ACK的情况下重新传递消息?当使用代理重新传递时,不应在该点进行缓存,因为消息可以立即重新发送给任何其他使用者(如果配置为这样做)。在大多数情况下,重新交付很少发生,但从技术上讲,它会增加网络使用率。没有确认超时。代理会将消息标记为已分派给该使用者,直到使用者的会话结束或生成ack为止,因此客户端代码需要确定处理某个消息是否需要很长时间。但是,您可以有连接超时