虚拟主题/队列和持久性

Jan*_*ide 5 activemq-classic

当没有消费者倾听时,发布到虚拟主题的消息会发生什么?经纪人会持有一段时间,直到订户可用吗?

更具体地说:在T0和T1处,发布消息M0和M1.在T2,消费者C1连接,他会收到M0和M1吗?显然,在T3和T4发布的消息M2和M3将由C1接收,但是在T5连接的新消费者C2将接收什么?所有消息,M2和M3,还是没有?

sro*_*uez 4

这取决于主题的性质:如果主题是持久的(有持久消费者订阅它),代理将保留该主题中的消息,直到所有持久消费者消费该消息。如果主题是非持久的(没有持久消费者),则消息甚至不会发送到该主题,因为不会有持久订阅。

对于您的示例,我将考虑您正在使用持久订阅/消费者:情况 1:

  • T-2 C1和C2对该主题进行持久订阅
  • T-1 C1和C2断开
  • T0:M0 已发布
  • T1:M1 已发布
  • T2:C1 连接。C1接收M0和M1
  • T3:M3 已发布。C1接收M3
  • T4:M4 已发布。C1接收M4
  • T5:C2连接,C2接收M0、M1、M2、M3、M4

那是因为它们持有持久订阅。 使用持久主题/队列时需要非常小心:如果消费者不取消订阅,代理将保留消息,直到消息存储爆炸。您需要确保它不会发生(通过设置驱逐策略和/或在消息上设置生存时间)。当然,前面的示例会根据消费者何时进行持久订阅而有所不同。

如果您使用非持久主题:

  • T-2 C1、C2正常订阅主题
  • T-1 C1和C2断开
  • T0:M0 已发布
  • T1:M1 已发布
  • T2:C1 连接。C1没有收到任何东西
  • T3:M3 已发布。C1接收M3
  • T4:M4 已发布。C1接收M4
  • T5:C2连接,C2没有收到任何东西