ServerEndpoint的每个方法都是由不同的线程执行的吗?

时间:2016-07-05 03:05:25

标签: multithreading java-ee websocket tyrus

我使用GF 4作为JavaEE服务器。

这就是我理解servlet处理的方式:有一个线程池,当请求到来时,来自该池的一个线程被用来处理请求。之后,线程被放回池中。

基于上面的信息,我想(我不确定)websockets(服务器端点)是这样处理的:有线程池,何时

  • 客户端创建新的websocket,从池中获取线程以创建ServerEndpoint的新实例并执行@OnOpen方法。在该线程被放回池之后。
  • 客户端通过websocket向服务器发送消息。从池中获取线程以执行@OnMessage方法。在该线程被放回池之后。
  • 客户端关闭websocket - 从池中获取线程以执行@OnClose方法。在该线程被放回池之后。

这一切都意味着ServerEndpoint的每个方法都可以由不同的线程执行。我的理解是对的吗?

1 个答案:

答案 0 :(得分:3)

只要在ServerEndpoint期间关联的WebSocket会话可用作Session参数,@OnOpen实例就会存在。在该WebSocket会话期间,可能会触发许多HTTP和WebSocket请求。每个此类请求都作为单独的线程进行记帐。

换句话说,如果您的ServerEndpoint类由于某种原因需要在多个方法中处理实例变量,则必须以线程安全的方式实现它。根据具体的功能要求,您可能最好使用chrome.windows.onCreated来携带与WS会话相关联的状态(将其视为会话属性)。

注意应该是这一切都与使用的容器和WS实现无关。