一尘不染

Tomcat 8 JSR 356 WebSocket线程

tomcat

我正在Tomcat 8中使用JSR-356
WebSocket支持来驱动我正在处理的应用程序。到目前为止,似乎所有消息都在单个线程中处理。虽然我了解了这背后的原因-
以及为什么以这种方式实现websocket,但是有什么方法可以使用ExecutorService处理传入的消息(无需在我的代码中创建ExecutorService)?

这将允许具有1个(或只有几个)网络选择器线程(以支持大量连接的客户端)的可伸缩性,同时允许对实际消息进行基于标准线程的处理(当需要处理消息时)。一个客户)。

我看不到有什么特别的可以更改的内容。


阅读 213

收藏
2020-06-16

共1个答案

一尘不染

线程模型取决于您使用的连接器。为了实现可伸缩性,您要使用NIO(默认设置)或APR
/本机(从8.0.0-RC3开始的越野车)。NIO实际上是当前的唯一选择。APR /本机问题应尽快解决(当我看到此问题时,我正在研究该问题)。

NIO使用选择器和线程池来处理收到的消息。当选择器检测到数据可用时,它将套接字从线程池传递给线程(通过执行程序)以对其进行处理。该处理可能导致数据在内部被缓冲,部分消息被通知应用程序,完整消息或这些的组合被通知应用程序。向应用程序的通知由处理传入数据的同一线程处理。

如果从多个客户端接收到多个消息,则将分派多个线程来处理这些消息。

JSR 356
API中没有功能,该功能允许应用程序选择要通过ExecutorService处理的消息或部分消息,而应用程序已经收到新消息的通知,而应用程序并未实现。对于仅处理整个消息的应用程序来说,这应该相对简单。如果应用程序处理部分消息,那么它将更加困难。

APR /本机(一次固定)的行为与NIO相同。BIO始终使用阻塞IO(即使在JSR356
API指示非阻塞的情况下),并且每个连接的客户端需要一个线程,而不是每个连接的客户端需要一个线程来处理数据。

2020-06-16