我正在使用Tomcat 8中的JSR-356 WebSocket支持来驱动我正在开发的应用程序。到目前为止,看起来所有消息都在单个线程中处理。虽然我理解这背后的原因 - 以及为什么以这种方式实现 websockets,但有没有办法使用 ExecutorService
来处理传入的消息(无需在我的代码中创建 ExecutorService(?
这将允许具有 1(或仅几个(网络选择器线程(以支持大量连接的客户端(的可伸缩性,同时允许对实际消息进行基于标准线程的处理(当需要为客户端处理消息时(。
我没有看到任何特别可以改变这一点的东西。
线程模型因您使用的连接器而异。对于可扩展性,您希望使用 NIO(默认(或 APR/本机(从 8.0.0-RC3 开始有缺陷(。蔚来汽车确实是目前唯一的选择。APR/本机问题应该很快就会解决(当我看到这个问题时,我正在解决这个问题(。
NIO 使用选择器和线程池来处理收到的消息。当选择器检测到数据可用时,它会将套接字从线程池(通过执行器(传递给线程以处理它。该处理可能导致在内部缓冲数据、通知应用程序部分消息、通知应用程序完整消息或这些消息的组合。对应用程序的通知由处理传入数据的同一线程处理。
如果从多个客户端接收到多条消息,则将调度多个线程来处理这些消息。
JSR 356 API 中没有任何功能允许应用程序选择通过 ExecutorService 处理消息或部分消息,因为应用程序已收到新消息的通知,而应用程序没有实现新消息。对于仅处理整个消息的应用程序来说,实现这一点应该相对简单。如果应用程序处理部分消息,那么它将更加困难。
APR/原生(一旦修复(的行为方式将与蔚来汽车相同。BIO 始终使用阻塞 IO(即使 JSR356 API 指示非阻塞(,并且还需要每个连接的客户端一个线程,而不是每个连接的客户端一个线程来处理数据。