Activemq 虚拟主题/队列和持久性

Activemq 虚拟主题/队列和持久性,activemq,Activemq,当没有消费者收听时,发布到虚拟主题的消息会发生什么情况?在订户有空之前,经纪人会持有它们一段时间吗 更具体地说: 在T0和T1,发布消息M0和M1。在T2处,耗电元件C1连接,他会接收M0和M1吗?显然,在T3和T4发布的消息M2和M3将由C1接收,但在T5连接的新消费者C2将接收什么?所有消息,M2和M3,还是无消息 这取决于主题的性质: 如果主题是持久的(有持久的使用者订阅它),代理将保留主题中的消息,直到所有持久的使用者使用这些消息。 如果主题是非持久的(没有持久的使用者),则消息甚至不会

当没有消费者收听时,发布到虚拟主题的消息会发生什么情况?在订户有空之前,经纪人会持有它们一段时间吗

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

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

对于您的示例,我将考虑使用持久订阅/消费者: 案例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不接收任何内容

为什么不存在观察者/可观察模式-以上面的示例为例:


发布M0时,C1和C2(订阅的消费者)被唤醒,可以使用事件?我认为这种模式比持久性和非持久性更好——一种混合的方法。

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

我将不得不问,到目前为止您尝试了什么?还没有时间尝试,可以。目前对我来说只是一个理论问题,但我需要知道