【问题标题】:Delete messages from specific durable Tibco EMS subscription从特定的持久 Tibco EMS 订阅中删除消息
【发布时间】:2014-10-27 21:48:24
【问题描述】:

我有 Tibco EMS 服务器、一些主题和这些主题的持久订阅数量(每个主题不止一个)。 我的任务是删除(通过以适当的确认模式接收它们)特定持久订阅者的消息。 我的问题:是否可以通过用我自己的订阅者(具有相同的名称,id)“替换”它来管理订阅者的待处理消息?并且重要的是不要影响主题的待处理消息,换句话说,从一个主题订阅中删除一些消息,但将这些消息保留在另一个主题(同一主题)订阅中。

【问题讨论】:

  • 我认为你做不到。每个订阅者都会收到他们自己的消息副本。如果您创建一个订阅者,您将无法获得发送给另一个订阅者的消息。您可能会发现此链接中的答案很有帮助。 stackoverflow.com/questions/8284143/….

标签: java tibco ems


【解决方案1】:

嗯,我找到了答案,只是之前忘记发布了。

如上所述,根据问题本身,无法从主题中删除消息。但我几乎没有什么不同的任务:删除特定 durable 订阅下的消息。这是真实的(在某些条件下)。

可以说,您必须从 durable 订阅“MySubscr”中删除消息。为此,您应该创建连接并创建具有相同名称“MySubscr”的持久订阅者。但这还不够。如果您只是这样做,那么将创建另一个具有相同名称但与不同 ClientID 连接的持久订阅者。并且它将作为独立的持久连接运行,对所需的“MySubscr”持久连接没有任何影响(实际上,它们看起来像 MySubscr:123 和 MySubscr:567 持久订阅,其中 123 和 567 是 ClientID,至少对于 TibcoEMS)。要修复它,您应该通过 connection.setClientID() 方法将 ClientID 显式设置为您的连接,但只有在未连接初始连接时才能这样做(这就是我提到 durable 订阅者,它可以在没有订阅者连接的情况下累积消息)。

所以你应该等到订阅者自己断开连接(TibcoEMS 的 isConnected() 方法,我在 JMS API 中没有看到类似的方法,但假设大多数实现都有这样的东西)或手动销毁连接(具有特定 ClientID)(TibcoEMS 的 TibjmsAdmin.destroyConnection() 方法)。然后将 ClientID 设置为您的连接并访问该订阅者的消息。您可以通过使用确认模式客户端(然后它们将保留在主题中)或使用自动模式(然后它们将被删除)来阅读消息。

重要提示:你不能消费某些特定的消息,所有的消息都像队列一样被消费,所以你只能一个接一个地消费。如果您发现了一些不需要的消息并希望删除它(通过使用自动确认模式或调用消息上的 acknowledge() 方法),那么您将丢失之前的所有消息。 AFAIK,如果不删除以前的消息,就无法删除消息。

另一个重要的注意事项:当你做你的消息魔术时,初始客户端在你的连接没有关闭之前不要再次连接是很重要的,因为它会得到 DuplicateClientIDException(如果它正在使用某些ClientID),否则它将创建另一个持久订阅,该订阅将无法访问来自订阅的先前消息。

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2015-06-16
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    相关资源
    最近更新 更多