我正在Tomcat 8中使用JSR-356 WebSocket支持来驱动我正在处理的应用程序。到目前为止,似乎所有消息都在单个线程中处理。虽然我了解了这背后的原因- 以及为什么以这种方式实现websocket,但是有什么方法可以使用ExecutorService处理传入的消息(无需在我的代码中创建ExecutorService)?
ExecutorService
这将允许具有1个(或只有几个)网络选择器线程(以支持大量连接的客户端)的可伸缩性,同时允许对实际消息进行基于标准线程的处理(当需要处理消息时)。一个客户)。
我看不到有什么特别的可以更改的内容。
线程模型取决于您使用的连接器。为了实现可伸缩性,您要使用NIO(默认设置)或APR /本机(从8.0.0-RC3开始的越野车)。NIO实际上是当前的唯一选择。APR /本机问题应尽快解决(当我看到此问题时,我正在研究该问题)。
NIO使用选择器和线程池来处理收到的消息。当选择器检测到数据可用时,它将套接字从线程池传递给线程(通过执行程序)以对其进行处理。该处理可能导致数据在内部被缓冲,部分消息被通知应用程序,完整消息或这些的组合被通知应用程序。向应用程序的通知由处理传入数据的同一线程处理。
如果从多个客户端接收到多个消息,则将分派多个线程来处理这些消息。
JSR 356 API中没有功能,该功能允许应用程序选择要通过ExecutorService处理的消息或部分消息,而应用程序已经收到新消息的通知,而应用程序并未实现。对于仅处理整个消息的应用程序来说,这应该相对简单。如果应用程序处理部分消息,那么它将更加困难。
APR /本机(一次固定)的行为与NIO相同。BIO始终使用阻塞IO(即使在JSR356 API指示非阻塞的情况下),并且每个连接的客户端需要一个线程,而不是每个连接的客户端需要一个线程来处理数据。