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