ServerEndpoint 的每个方法是否由不同的线程执行?
Is every method of ServerEndpoint executed by different thread?
我使用 GF 4 作为 JavaEE 服务器。
我是这样理解 servlet 处理的:有一个线程池,当请求到来时,从这个池中取出一个线程来处理请求。之后线程被放回池中。
根据以上信息,我假设(我不确定)websockets(服务器端点)是这样处理的:有线程池,当
- 客户端创建新的 websocket 从池中获取线程以创建 ServerEndpoint 的新实例并执行 @OnOpen 方法。在该线程被放回池中之后。
- 客户端通过 websocket 向服务器发送消息。线程从池中取出来执行@OnMessage 方法。在该线程被放回池中之后。
- 客户端关闭 websocket - 线程从池中取出来执行@OnClose 方法。在该线程被放回池中之后。
这一切意味着ServerEndpoint的每一个方法都可以被不同的线程执行。我的理解对吗?
是的。
只要关联的 WebSocket 会话在 @OnOpen
期间作为 Session
参数可用,ServerEndpoint
实例就会存在。在该 WebSocket 会话期间,可能会触发许多 HTTP 和 WebSocket 请求。每个这样的请求都作为一个单独的线程。
换句话说,如果你的ServerEndpoint
class由于某种原因需要在多个方法中处理实例变量,则必须以线程安全的方式实现。根据具体的功能要求,您最好使用 Session#getUserProperties()
来代替与 WS 会话相关的状态(将其视为会话属性)。
请注意,这一切都与使用的容器和 WS 实现无关。
我使用 GF 4 作为 JavaEE 服务器。
我是这样理解 servlet 处理的:有一个线程池,当请求到来时,从这个池中取出一个线程来处理请求。之后线程被放回池中。
根据以上信息,我假设(我不确定)websockets(服务器端点)是这样处理的:有线程池,当
- 客户端创建新的 websocket 从池中获取线程以创建 ServerEndpoint 的新实例并执行 @OnOpen 方法。在该线程被放回池中之后。
- 客户端通过 websocket 向服务器发送消息。线程从池中取出来执行@OnMessage 方法。在该线程被放回池中之后。
- 客户端关闭 websocket - 线程从池中取出来执行@OnClose 方法。在该线程被放回池中之后。
这一切意味着ServerEndpoint的每一个方法都可以被不同的线程执行。我的理解对吗?
是的。
只要关联的 WebSocket 会话在 @OnOpen
期间作为 Session
参数可用,ServerEndpoint
实例就会存在。在该 WebSocket 会话期间,可能会触发许多 HTTP 和 WebSocket 请求。每个这样的请求都作为一个单独的线程。
换句话说,如果你的ServerEndpoint
class由于某种原因需要在多个方法中处理实例变量,则必须以线程安全的方式实现。根据具体的功能要求,您最好使用 Session#getUserProperties()
来代替与 WS 会话相关的状态(将其视为会话属性)。
请注意,这一切都与使用的容器和 WS 实现无关。