跳到主要内容

线程处理

Solace JMS API 使用处理上下文来组织客户端应用程序与事件代理之间的通信。这个上下文封装了驱动网络 I/O 和消息传递通知的线程,用于客户端应用程序与事件代理之间的连接。消息的传递和接收也需要应用程序提供的线程。

默认情况下,每个创建的 JMS 连接都使用一个处理上下文。然而,为了使用单个上下文处理 JMS 客户端所创建的所有 JMS 连接,可以将 InitialContext 环境属性 SOLACE_JMS_USE_DEFAULT_CONTEXT 设置为 true。每个上下文都需要额外的线程。

接收消息时的线程处理

在接收消息时,处理上下文使用上下文线程从套接字读取消息并解析它们。对于异步 MessageConsumer,通常使用第二个上下文线程来执行消费者通知和消息分发。(然而,在使用超低延迟应用程序时,同一个单一上下文线程也可以用于异步 MessageConsumer。)对于同步 MessageConsumer,同一个单一上下文线程可以将消息排队以便传递或消费。

异步接收消息

客户端应用程序可以通过 MessageListener 以异步方式接收消息。也就是说,当消息可用时,它们会自动发送(“推送”)到客户端应用程序提供的消息监听器接口。

在异步接收消息时,处理上下文使用一个线程进行消费者通知和分发已排队的消息;所有监听器(MessageListenerExceptionListener)也从处理线程运行。

默认情况下,上下文使用一个线程从网络读取消息、解析它们,然后将它们排队到消费者通知分发器队列中。它使用另一个线程进行消费者通知和将排队的消息分发给消费客户端应用程序。

上下文在将消息传递给消费者之前,每个会话可以排队的最大消息数如下:

  • 直接消息(即使用直接传输发送的非持久消息)——5,000 条
  • 保证消息(即使用保证传输发送的非持久和持久消息)——每个消费者的滑动保证消息窗口大小所允许的最大保证消息数。保证消息窗口大小限制了消费者在必须向事件代理返回确认已收到窗口中的消息之前可以接收的消息数量。

保证消息窗口大小是通过连接工厂的 receive‑ad‑window-size 消息传递属性设置的。为此属性设置的值适用于使用该连接工厂的每个消费者。

用于通过 MessageListener 异步通知消费者消息和通过 ExceptionListener 通知异常的消费者通知分发器队列可以根据需要调整大小。该队列应足够大,以缓冲为 JMS 连接中所有会话中的所有消费者(包括保证和直接消息的消费者)生成的所有通知的最大数量。如果 MessageListenerExceptionListener 不总是快速返回控制权,并且消费者通知分发器队列已满,尝试将通知排队到此队列的 API 线程可能会暂时被阻塞,这可能导致消息在事件代理上排队。

可以通过 SOLACE_JMS_CONSUMER_DISPATCHER_QUEUE_SIZE 属性修改消费者通知分发器队列大小。然而,这通常不是必需的。

下图显示了用于异步接收消息的上下文线程。

异步接收消息

img

同步接收消息

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

为了接收消息,客户端应用程序必须使用Connection.start()来启用从事件代理接收消息,然后使用同步的MessageConsumer.receive(...)调用来接收下一条可用的消息。接收方法可以通过无限期等待直到有消息、在没有消息时不等待(即,当没有消息时立即超时),或者在没有消息时在设定的时间后超时来管理潜在的阻塞。

下图显示了在通过API同步接收消息时使用的上下文线程和应用程序线程。

同步接收消息

img