跳到主要内容

API线程模型

API 使用上下文(context)来组织客户端应用程序与 Solace PubSub+ 事件代理之间的通信。上下文充当配置一个或多个会话以及处理与会话相关事件的容器,并封装了用于驱动会话的网络 I/O 和消息传递通知的线程。消息的传递和接收也可能需要应用程序提供的线程。


发布消息时的线程模型

客户端应用程序提供用于将保证消息(Guaranteed messages)发布到事件代理目标所需的处理线程。

当事件代理成功接收到保证消息时,它会向 API 返回确认消息。对于直连消息(Direct messages),它不会返回确认消息(使用 JCSMP 的非流式发布模式发布直连消息是一个例外)。

上下文使用一个处理线程从事件代理读取确认消息,然后解析窗口确认(windowed acknowledgment),为每条消息(通过消息 ID 识别)排队单独的确认消息,最后将它们分发到应用程序回调中。

Java RTO、C 和 .NET API

在 Java RTO、C 和 .NET API 中,上下文使用单个线程读取事件代理发送的保证消息的窗口确认并解析它们。与 JCSMP 不同,事件代理的确认消息不会放入通知队列,而是使用同一线程进行通知并将排队的确认消息分发到应用程序回调。

下图展示了用于发送保证消息的应用程序线程和用于处理事件代理的窗口消息确认的上下文线程。

使用 C 和 .NET API 发布保证消息

img

JavaScript 和 Node.js API

JavaScript 和 Node.js API 是单线程的,包括将确认消息分发到应用程序事件监听器。


接收消息时的线程模型

在接收已发布消息时,上下文使用一个处理线程从套接字读取消息,解析它们,然后根据消息 API 的类型以及是否使用同步或异步模式,将消息排队以供传递或消费,或者执行客户端通知和消息分发。

客户端应用程序可以使用以下模式之一接收已发布消息:

  • 异步模式
    客户端应用程序可以使用 Java RTO、C 和 .NET API 异步接收已发布消息。更多信息请参阅“异步接收消息”。

  • 同步模式
    客户端应用程序也可以使用 JCSMP 同步接收已发布消息。更多信息请参阅“同步接收消息”。


异步接收消息

客户端应用程序可以使用 Java RTO、C 和 .NET API 以异步方式接收消息。也就是说,当消息可用时,它们会自动从 API“推送”到客户端应用程序的消息回调或消息委托接口。

在异步接收消息时,上下文使用一个处理线程进行消费者通知并将排队的消息分发到消费者;所有从 API 到应用程序的回调(如消息接收回调、事件回调和定时器回调)都运行在上下文线程上。

当客户端应用程序使用异步事务性会话时,消息会从一个或多个事务性会话分发线程中分发。可以使用绑定到上下文的单个事务性会话分发线程(这是默认行为),或者使用绑定到每个事务性会话的独立事务性会话分发线程。更多信息请参阅“使用本地事务”。

Java RTO、C 和 .NET API

Java RTO、C 和 .NET API 的上下文异步接收消息的方式类似于 JCSMP 在启用 MESSAGE_CALLBACK_ON_REACTOR 会话属性时的方式。Java RTO、C 和 .NET API 的上下文仅使用一个处理线程。该线程从套接字读取消息,解析它们,然后执行消费者通知并将消息分发到消费应用程序。

对于 C API,所需的上下文线程可以由客户端应用程序提供,而不是依赖内部 API 线程。更多信息请参阅“C API 最佳实践”。

使用 Java RTO、C 和 .NET API 异步接收消息

img

JavaScript 和 Node.js API

JavaScript 和 Node.js API 是单线程的,包括通过应用程序消息事件监听器异步接收消息。


同步接收消息

在同步接收消息时,客户端应用程序使用显式的接收调用从 API 为每个消费者使用的消息队列中检索消息。在同步接收消息时,客户端应用程序提供从 API“拉取”排队消息的线程。

Java RTO、C 和 .NET API

Java RTO、C 和 .NET API 只能在非事务性会话中异步接收消息。然而,这些 API 可以在事务性会话中同步接收消息。

JavaScript 和 Node.js API

JavaScript 和 Node.js API 不支持同步接收消息。