程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何管理 WebSocket 端点中的线程?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何管理 WebSocket 端点中的线程??

开发过程中遇到如何管理 WebSocket 端点中的线程?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何管理 WebSocket 端点中的线程?的解决方法建议,希望对你解决如何管理 WebSocket 端点中的线程?有所启发或帮助;

我正在 Wildfly 上使用 Web 套接字开发应用程序。我不知道 Wildfly 如何管理 Web 套接字的线程。我猜有一些线程池,但我注意到一个 Web 套接字端点只有一个线程。 Wildfly 使用 Web 套接字的 Undertow 实现。我不确定为 Web 套接字端点创建附加线程是否是个好主意。我的要求有点不寻常。我使用 JsonRPC 协议。服务器既是 JsonRcp 客户端又是 JsonRpc 服务器。客户端也是 JsonRcp 客户端和 JsonRpc 服务器。这意味着服务器可以向客户端发送 JsonRpc 请求,客户端也可以向服务器发送 JsonRpc 请求。实现它的一种方法是打开两个 Web 套接字连接。第一个连接将用于客户端请求和服务器响应,第二个连接将用于服务器请求和客户端响应。我不确定打开两个 Web 套接字连接是否是个好主意,因为我在 Google 上搜索了这个想法,而且相当不鼓励。一个网络套接字连接就足够了,只需妥善处理即可。

我注意到网络套接字端点有一个线程。我的意思是@Onmessage 方法在一个线程上执行,如果两条消息被发送到 web 套接字端点,那么第二条消息将在第一条消息处理结束后进行处理。我的@Onmessage 方法可以接收请求和响应,我看到它们可能会相互延迟的风险。我的意思是,例如客户端向服务器发送 Json RPC 请求,服务器 @Onmessage 方法很忙,因为它处理 JsON RPC 请求并准备 JsON RPC 响应。同时,服务器从其他线程向客户端发送无关的 JsON RPC 请求。让我们假设这个请求的处理速度非常快,并且 JsON RPC 响应是从客户端发送到服务器的。由于@Onmessage 方法忙,服务器无法快速接收响应。

import java.io.IOException;
import javax.websocket.onmessage;
import javax.websocket.onopen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint( value = "/endpoint" )
public class MyWebSocketEndpoint
{

    private Session session;

    @Onopen
    public voID onopen( Session aSession )
    {
        this.session = aSession;
    }

    @Onmessage
    public voID onmessage( String amessage )
    {
        if( isrequest( amessage ) )
        {
            // process request and prepare response
            String response = "JsonRpcResponse....";
            try
            {
                session.getBasicRemote()
                    .sendText( response );
            }
            catch( IOException aE )
            {
                aE.printstacktrace();
            }
        }
        else if( isResponse( amessage ) )
        {
            // process response
        }

    }
    ...  
}

就我而言,响应处理速度相当快。处理请求可能需要一些时间,所以我认为应该在单独的线程中处理该请求,但我不希望单个 Web 套接字端点可以同时处理两个请求。单个端点只能按时处理一个请求,其他请求应排队。我的意思是这样的

import java.io.IOException;
import java.util.concurrent.Executorservice;
import java.util.concurrent.Executors;

import javax.websocket.onmessage;
import javax.websocket.onopen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint( value = "/endpoint" )
public class MyWebSocketEndpoint
{

    private Session session;
    final Executorservice executorservice = Executors.newSingleThreadExecutor();

    @Onopen
    public voID onopen( Session aSession )
    {

        this.session = aSession;
    }

    @Onmessage
    public voID onmessage( String amessage )
    {
        if( isrequest( amessage ) )
        {
            executorservice.execute( () -> {// process request and prepare response
                String response = "JsonRpcResponse....";
                try
                {
                    session.getBasicRemote()
                        .sendText( response );
                }
                catch( IOException aE )
                {
                    aE.printstacktrace();
                }
            } );
        }
        else if( isResponse( amessage ) )
        {
            // process response
        }

    }
}

恐怕这不是个好主意,因为:

  1. Java EE 容器中的应用程序不应创建线程。 Java EE 容器管理线程,应用程序应仅使用托管线程。
  2. 恐怕这有点矫枉过正。每个 Web 套接字端点都将使用额外的线程,并且线程数量可能会增加太多。

如何妥善处理我的案件?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的如何管理 WebSocket 端点中的线程?全部内容,希望文章能够帮你解决如何管理 WebSocket 端点中的线程?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。