【问题标题】:Java Web Socket ServerEndpoint Thread SafetyJava Web Socket ServerEndpoint 线程安全
【发布时间】:2016-03-16 22:35:47
【问题描述】:

单个 ServerEndpoints 是线程安全的,还是属于在给定时间与其交互的所有客户端?

或者问同样问题的另一种方式: ServerEndpoint 类中的全局对象是否存在产生并发问题的危险,like they do in HttpServlets

This example 似乎表明每个 Endpoint 都是线程安全的,或者他只是在使用 Set 并祈祷不要弹出并发问题?

那么,假设它们是线程安全的,容器(Tomcat、Glassfish 等)是否会在每次建立来自不同客户端的新连接时创建 ServerEndpoint 类的新实例?

【问题讨论】:

    标签: concurrency websocket java-ee-7


    【解决方案1】:

    默认情况下,每个客户端连接都会创建新的@ServerEndpoint 实例。 (这似乎也是最后一个问题的答案)。

    静态对象(或对它们的访问)必须同步。

    链接示例使用synchronizedSet,所以看起来还可以。

    另外 - 在之前的@OnMessage 处理结束之前,@OnMessage 方法不会被触发,但它可以从不同的线程调用。这意味着您将始终按顺序处理传入的消息。

    【讨论】:

    • 关于你的最后一句话,它为每个客户端依次处理所有传入的消息? (或 ServerEndpoint 的每个实例)
    • Nvm,我刚刚在这里找到了你的帖子:blogs.oracle.com/PavelBucek/entry/…
    • 如果传入的消息是按顺序处理的,那么在池中拥有多个线程的目的是什么?例如,在 Tyrus 源代码中,我看到 1 个选择器线程和 2 个工作线程。为什么是 2?
    猜你喜欢
    • 2011-11-13
    • 2013-07-29
    • 1970-01-01
    • 2014-09-19
    • 2014-01-02
    • 1970-01-01
    • 2013-06-06
    相关资源
    最近更新 更多