虚拟主题/队列和持久性

时间:2012-01-26 14:04:13

标签: activemq

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

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

3 个答案:

答案 0 :(得分: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

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

如果您使用的是非持久性主题:

  • 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没有收到任何内容

答案 1 :(得分:1)

允许发布到虚拟主题的消息有两种方法可以使用。第一个是通过持久订阅者,另一个是发布者发送传递模式为“PERSISTENT”的消息。当使用“PERSISTENT”的传送模式发布消息时,消息将保存在磁盘上,否则将保存在内存中。

答案 2 :(得分:0)

为什么不能有观察者/可观察的模式 - 以上面的例子为例:

当发布M0时,C1和C2(消费者订阅)被唤醒并且可以消费该事件?我认为这种模式比耐用和非耐用更好 - 混合方法。