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