跳到主要内容

在PubSub+ JCSMP API中浏览保证消息

PubSub+ JCSMP API 可以使用队列浏览器对象查看队列上按从旧到新的顺序存储的保证消息。

浏览器对象使您的应用程序能够浏览队列上的消息,并根据需要选择性地删除消息。这可以独立于绑定到队列的任何其他流完成。即使其他应用程序已连接并在队列上处于活动状态,浏览器也允许您连接到独占队列。当您连接到非独占队列时,您可以查看队列上的所有消息。在这种情况下,您的浏览器不受用于向普通消费者投递消息的轮询方法的约束。浏览消息后,客户端仍然可以通过流接收这些消息。

队列的访问类型(独占或非独占)不影响客户端浏览其存储消息的能力。它只影响客户端消费这些消息的能力。有关访问类型的更多信息,请参阅 PubSub+ JCSMP API 中的定义端点属性。

有关如何浏览队列上消息的示例,请参阅 Solace 开发者中心上的 QueueProvisionAndBrowse.java 示例。

创建浏览器

要使用 JCSMP API 浏览队列的存储保证消息,客户端必须在会话中创建一个浏览器。

要创建浏览器,请调用 JCSMPSession.createBrowser(BrowserProperties properties) 方法,并传入一组浏览器属性。

在定义一组新的浏览器属性时,请确保执行以下操作:

  • 指定您要浏览的队列端点。只有队列可以被浏览 — 主题端点不能被浏览。对于 JCSMP,队列是通过流属性设置的。

  • (可选)对于 JCSMP,指定 Selector 属性的筛选器字符串,以仅浏览符合该筛选器的消息。当使用筛选器时,等待超时时间可能会显著增加,因为消息总线需要更长时间来评估存储消息是否符合筛选器。筛选器的复杂性也会增加评估时间。(有关筛选器和筛选器语法的信息,请参阅 PubSub+ JCSMP API 中的选择器使用。)

  • (可选)为了提高浏览性能,通过传输窗口大小属性指定浏览器可以从队列预取并本地缓冲的最大消息数。

  • (可选)通过 WaitTimeout 属性指定在从本地消息缓冲区返回时,如果没有可用消息,则 GetNext 操作的最大等待超时时间(以毫秒为单位)。

  • 如果会话尚未连接 PubSub+ JCSMP API 会自动连接会话并创建浏览器实例。

  • 浏览器或浏览器流的生命周期与其创建所在的会话相关联。因此,关闭会话会关闭该会话中创建的所有浏览器。

关闭浏览器

为了释放分配的内存,当应用程序完成使用时,关闭浏览器实例非常重要。要关闭浏览器或浏览器流,请调用 Browser.close()

使用JCSMP API浏览消息

要使用 JCSMP API 浏览队列上的保证消息,请执行以下操作:

  1. 获取浏览器实例。

参阅创建浏览器。

  1. (可选)要检查本地消息缓冲区中是否立即有可用消息,请调用 HasMore 方法。

如果本地缓冲区中至少有一条消息,此方法返回 true。如果返回 false,并不一定意味着队列为空,而是本地缓冲区当前不包含任何消息。后续对 HasMoreGetNext 方法的调用可能会分别返回 true 或返回一条消息。

提供这些方法是为了支持 JMS 实现中 javax.jms.QueueBrowser 使用的枚举模式。

  1. 要查看队列中的消息,请调用 GetNext 方法。

    • GetNext 是一个同步操作,返回消息的完整内容(即,包含所有消息头和有效载荷)。每次调用 GetNext 都会返回队列中的下一条消息(按从旧到新的顺序)。
    • GetNext 方法会检查本地缓冲区中的消息。如果有消息可用,它会立即返回;如果没有消息可用,调用将返回 null(当使用 GetNextNoWait() 方法时),或者在使用 GetNext() 方法时等待消息,直到设置的时间量到期。

客户端应用程序不应假设 API 在浏览存储消息时使用的轮询策略。例如,在浏览消息时,API 可能正在从事件代理请求更多消息,或者返回已缓冲的消息。

浏览时删除消息

客户端可以在浏览队列时选择性地删除存储的保证消息。删除浏览的消息会从队列中删除它们,因此它们不能再被消费客户端接收(或者如果它们曾经被投递到消费者,也不会被重新投递)。

在浏览时选择性删除消息在管理员想要从队列中删除“卡住”的保证消息时非常有用,而无需修改或干扰现有的消费客户端。如果消息:

  • 已被客户端接收,但该客户端未能确认它。
  • 所有活动消息筛选器都未能匹配该消息,因此该消息未被投递到任何客户端。

消息可能会卡住。

删除消息时不会返回确认。此外,如果尝试删除不存在的消息或已经从队列中删除的消息,也不会返回错误。

要删除浏览的消息,请调用 Browser.remove(BytesXMLMessage message)