跳到主要内容

在PubSub+ JCSMP API中接收直接消息

当事件代理有与客户端匹配的主题订阅时,可以直接消息可以使用 PubSub+ JCSMP API 在会话中传递给客户端。为了接收消息,客户端必须使用适合所用编程语言的消息接收接口或回调/委托。

直接消息通过获取的 XMLMessageConsumer 接口接收。XMLMessageConsumer 可以在异步模式(指定监听器时)或同步模式(未指定消息监听器时)下运行。

要获取 XMLMessageConsumer,请使用 JCSMPSession.getMessageConsumer(XMLMessageListener) 方法。

  • 要使用异步消息传递模式,请传入 XMLMessageListener 回调接口。
  • 要使用同步消息传递模式,请将消息监听器设置为 null

在为消费者调用 start() 后,使用以下方法接收消息:

  • receive() — 接收下一条可用消息,并等待消息可用。
  • receive(int timeoutInMillis) — 接收下一条可用消息。如果没有消息可用,该方法将阻塞,直到设置的时间到期。
  • receiveNoWait() — 接收下一条可用消息。

要启用获取的 XMLMessageConsumer 从底层连接读取消息并将消息传递给应用程序,请调用 XMLMessageConsumer.start()。要停止向应用程序传递消息,请调用 XMLMessageConsumer.stop()

XMLMessageConsumer 保持“打开”状态,直到调用 XMLMessageConsumer.close() 方法。

消息丢弃指示

接收客户端可以使用消息丢弃指示方法或函数查询事件代理是否由于任何原因丢弃了当前接收消息之前的所有直接消息。如果调用返回 true,则事件代理在当前消息之前丢弃了一条或多条消息;如果调用返回 false,则在当前消息之前没有丢失任何消息。

当客户端应用程序检测到已发生消息丢弃时,它应适当地处理此事件。例如,它可以遵循其常规的会话重新初始化过程。

要查询是否已丢弃消息,请使用 XMLMessage.getDiscardIndication() 方法。

  • 如果事件代理的每个客户端出站优先级队列中填满了已接收的消息,则可能会发生消息丢弃。当这种情况发生时,队列中最旧的消息可能会被丢弃,以便为新到达的消息腾出空间。在慢速订阅者(即,未能足够快速消费消息的客户端)的情况下,每个客户端的出站优先级队列可能会填满。有关每个客户端出站优先级队列及其配置的详细信息,请参阅消息传递资源。
  • 建议在使用消息省略时,消费客户端不要使用丢弃指示。在事件代理的客户端出站优先级队列中填满了已接收的消息的情况下,队列中最旧的消息将被丢弃,以为新到达的消息腾出空间,并且队列头部的消息将被标记为丢弃指示。然而,如果启用了省略,该消息可能会被省略,客户端将不会收到丢弃指示。

回复请求消息

要回复传入的请求消息,应用程序可以调用以下列出的方法之一,并提供要回复的请求消息以及要回复的消息内容。通常,由收到的请求消息提供回复地址和相关性 ID。回复方法或函数自动设置单比特响应属性,并使用与传入请求消息匹配的相关性 ID。

有关发送请求消息的信息,请参阅在 PubSub+ JCSMP API 中发布请求回复的消息。

要发送回复消息,请使用 XMLMessageProducer.sendReply(...) 方法。

相关示例

有关如何发送和接收请求/回复消息的示例,请参阅 Solace 开发者中心中的 RRDirectRequesterRRDirectReplier 示例。