【问题标题】:Is every method of ServerEndpoint executed by different thread?ServerEndpoint 的每个方法都是由不同的线程执行的吗?
【发布时间】:2016-07-05 03:05:25
【问题描述】:

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

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

根据上面的信息,我想(我不确定)websockets(服务器端点)是这样处理的:有线程池,什么时候

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

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

【问题讨论】:

    标签: multithreading jakarta-ee websocket tyrus


    【解决方案1】:

    是的。

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

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

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

    【讨论】:

    • 感谢您的回答。也许你知道——有 session.isOpen()。什么会返回这个方法?如果客户端计算机突然关闭,为什么?
    • 不客气。对于每个新问题,只需提出一个新问题。
    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2017-10-23
    • 2014-08-29
    相关资源
    最近更新 更多