美文网首页
The remote endpoint was in state

The remote endpoint was in state

作者: 傑仔 | 来源:发表于2020-03-16 15:52 被阅读0次
    3-16 14:59:13 109 ConsumeMessageThread_15 ERROR [] - The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method
    java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1206) ~[tomcat7-websocket.jar:7.0.90]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:1169) ~[tomcat7-websocket.jar:7.0.90]
        at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:194) ~[tomcat7-websocket.jar:7.0.90]
        at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37) ~[tomcat7-websocket.jar:7.0.90]
    

    使用websocket 做实时聊天系统,在生产环境上有业务人员反馈收不到消息,查看日志发现有很多The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method,猜测很可能是它引起的。
    产生原因:同时有多个线程调用了this.session.getBasicRemote().sendText(msg); 方法。
    修改前:

    public void sendMessage(String msg) {
                try {
                    this.session.getBasicRemote().sendText(msg);
                } catch (IOException e) {
                    this.sendMessage(new Response().failure(e.getMessage()));
                }
        }
    

    修改后:

    public void sendMessage(String msg) {
            synchronized(this.session) {
                try {
                    this.session.getBasicRemote().sendText(msg);
                } catch (IOException e) {
                    this.sendMessage(new Response().failure(e.getMessage()));
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:The remote endpoint was in state

          本文链接:https://www.haomeiwen.com/subject/kczgehtx.html