我想知道这里是否有人可以为我澄清以下内容。
让我们说我有一个主题,附有5个持久订阅者。每个订阅者都使用以下调用创建(每个用户的名称明显不同):
session.createDurableSubscriber(
(Topic) destination,
"NAME_n", // Unique for every subscriber
"PARTY_ID = '123'", // Message selector
true );
因此,当我发布带有PARTY_ID =' 123'的消息时,它将保留在主题中,直到所有5个持久订阅者都获得副本,对吗?
现在,让我们说我们有3个其他持久订阅者,其中包含消息选择器" PARTY_ID =' 666'"。当我发布一个' 666'消息到主题,将在3耐用的' 666'之后从主题中删除消息。订阅者收到消息,或者它会保留在那里,直到所有订阅者收到消息,在这种情况下,由于选择器的限制,它永远不会发生?
换句话说,主题上的邮件保留是否会考虑邮件和订阅者的邮件选择器?
答案 0 :(得分:2)
发布消息时,消息传递提供程序会将该消息的副本放入符合订阅者指定的选择条件的所有订阅者。在您的情况下,邮件的副本将被放置给5个订阅者,因为它们与选择器“PARTY_ID = 123”匹配。然后消息提供程序丢弃消息。类似地,对于选择器“PARTY_ID = 666”,消息传递提供者将仅将消息复制到匹配的订户,然后丢弃该消息。
请注意,消息提供商会将消息的副本放入分配给订阅者的存储(通常是队列),然后继续处理来自发布者的下一封消息。它不会等待订阅者使用队列中的消息。
Message retention
或Retain Publication
是另一个概念,消息提供程序将保留(或缓存)主题发布,直到收到同一主题的下一个发布。下一个出版物可能在下一秒或5分钟或5小时后出版。基本上下次发布的时间是不可预测的。当订阅者在出版物已经出版后进入并且在某个时间之后进行下一次出版时,这个概念非常有用。通过保留发布,保留的出版物的副本立即发送给订户,这样订户就不必等待下一次发布。
让我们假设一个出版商正在荷兰和西班牙之间就主题FIFA2014/MATCHUPDATE/NED-ESP
进行的FIFA2014正在进行的比赛中发布。发布者每次对目标进行评分时都会发布新消息。由于目标的评分是不可预测的,因此使用“保留发布”属性发布消息,该属性告知消息提供者保留消息的副本,直到下一封消息发布在FIFA2014/MATCHUPDATE/NED-ESP
上。假设在第一次发布时有两个订阅者并且得分为0:0。现在让我们假设第三个订阅者在第一次发布后进入,它将立即得到一个得分为0:0的出版物。在下一个进球得分之前,它不必等待知道得分。请参阅此link。
希望我很清楚。