我有Tibco EMS服务器,这个主题的一些主题和持久订阅数量(每个主题不止一个)。 我的任务是删除(通过以适当的确认模式接收它们)特定持久订户的消息。 我的问题是:是否可以通过"替换"来管理订阅者的未决消息。它与我自己的订户(具有相同的名称,ID)?重要的是不要影响主题的待处理消息,换句话说,从一个主题订阅中删除一些消息,但在其他主题(同一主题)订阅中保留这些消息。
答案 0 :(得分:0)
好吧,我找到了答案,忘了以前发布。
如上所述,在问题本身下,无法从主题中删除消息。但我没有什么不同的任务:删除特定持久订阅下的邮件。这是真实的(有些条件)。
假设您必须从持久订阅“MySubscr”中删除邮件。为此,您应该创建连接并创建具有相同名称“MySubscr”的Durable订阅服务器。但这还不够。如果您这样做,那么将创建另一个持久订阅者,其名称相同,但与不同的 ClientID 连接。它将作为独立的持久连接运行而不会对所需的“MySubscr”产生任何影响(实际上,它们看起来像MySubscr:123和MySubscr:567持久订阅,其中123和567是ClientID,至少对于TibcoEMS而言)。要修复它,您应该通过 connection.setClientID()方法将ClientID显式设置为您的连接,但只有在未连接初始连接时才能执行此操作(这就是为什么我注意到耐久< / em> subscriber,它可以在没有用户连接的情况下累积消息)。
所以你应该等到订阅者自己断开连接( isConnected()方法为TibcoEMS,我没有在JMS API中看到类似的方法,但是假设大多数实现都有东西像这样)或手动破坏连接(使用某些ClientID)(来自TibcoEMS的 TibjmsAdmin.destroyConnection()方法)。然后,将ClientID设置为您的连接,并访问该订户的消息。您可以通过使用确认模式客户端(然后它们将保留在主题中)或使用模式自动(然后它们将被删除)来消费它们来阅读消息。
重要说明:您无法使用某些消息,所有消息都会像在队列中一样消耗,因此您只能逐个消息。如果您发现了一些不需要的消息并希望将其删除(通过使用autoacknowledge模式或通过在消息上调用 acknowledge()方法),那么您将丢失所有先前的消息。 AFAIK,没有删除先前的消息就无法删除消息。
另一个重要的注意事项:当你做你的消息魔术时,初始客户端在你的连接没有关闭之前不再连接是很重要的,因为它会得到DublicateClientIDException(如果它正在使用某个ClientID),否则它将创建另一个Durable Subscription,它将无法访问订阅中的先前消息。