java.lang.IllegalStateException:远程终结点处于[TEXT\u PARTIAL\u WRITING]状态,这是被调用方法的无效状态

java.lang.IllegalStateException:远程终结点处于[TEXT\u PARTIAL\u WRITING]状态,这是被调用方法的无效状态,java,websocket,stomp,spring-websocket,sockjs,Java,Websocket,Stomp,Spring Websocket,Sockjs,我的代码: myStompClient = new WebSocketStompClient(new SockJsClient(list)); mySession = myStompClient .connect(WEBSOCKET_URI, bankHeaders, new StompSessionHandlerAdapter() { @Override public void afterConnected(StompSessio

我的代码:

myStompClient = new WebSocketStompClient(new SockJsClient(list));
mySession = myStompClient
        .connect(WEBSOCKET_URI, bankHeaders, new StompSessionHandlerAdapter() {
            @Override
            public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
                StompHeaders stompHeadersSubscribe = new StompHeaders();
                stompHeadersSubscribe.setDestination(CONSUMER_TECH_QUEUE);
                session.subscribe(stompHeadersSubscribe, new MyStompFrameHandler());// <-- this line fails
                .....
        }).get(5, TimeUnit.SECONDS);
有时会发生,有时不会


我无法理解原因,请澄清。

因为您试图从大量线程连接到websocket。 您应该使用下面的行:

synchronized(session) {
            session.subscribe(stompHeadersSubscribe, new MyStompFrameHandler())
        }

因为您试图从大量线程连接到websocket。 您应该使用下面的行:

synchronized(session) {
            session.subscribe(stompHeadersSubscribe, new MyStompFrameHandler())
        }

我遇到了这个问题,并提出了一种不同的方法,据我所知(这种问题似乎在stackOverflow中报告了大约4次…)还没有被探讨过

捕获错误,如果写操作正忙,请等待一段时间以完成,然后重试,如下所示。想法

static public void write(Session sess, String msg) {
    /*
     * to thwart the error: 'remote endpoint was in state [TEXT_FULL_WRITING] which
     * is an invalid state for called method use basic'
     * try, try again...
     */
    RemoteEndpoint.Basic basicRemote = sess.getBasicRemote();
    int i = 0; // tries...
    boolean bWriteSucceeded = false;
    if (verbose) {
        ; // you know... dump something somewhere...
    }
    if (sess.isOpen()) {
        for (i = 0; i < 10 && !bWriteSucceeded; i++) {
            try {
                // Crap. Sometimes getting this:
                // The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid
                // state for called method
                basicRemote.sendText(msg);
                bWriteSucceeded = true;
            } catch (IOException e) {
                // Enhance the auto-generated catch block to try again...
                // TODO: check for if (e == java.io.EOFException))
                if (i < 10 && !bWriteSucceeded) {
                    msleep(20);
                    System.out.println("Write tried:" + i + "times and failed.");
                    continue;
                } // Admit failure.
                System.out.println("Write failed: " + i + " retries. Dumping stackTrace");
                e.printStackTrace();
            }
        }
    }
    // succeed on first time and say nothing...
    if (bWriteSucceeded && i > 0)
        System.out.println("Write took " + i + " tries to succeed.");
    else
        System.out.println("Write failed after " + i + " retries.");
}

我遇到了这个问题,并提出了一种不同的方法,据我所知(这种问题似乎在stackOverflow中报告了大约4次…)还没有被探讨过

捕获错误,如果写操作正忙,请等待一段时间以完成,然后重试,如下所示。想法

static public void write(Session sess, String msg) {
    /*
     * to thwart the error: 'remote endpoint was in state [TEXT_FULL_WRITING] which
     * is an invalid state for called method use basic'
     * try, try again...
     */
    RemoteEndpoint.Basic basicRemote = sess.getBasicRemote();
    int i = 0; // tries...
    boolean bWriteSucceeded = false;
    if (verbose) {
        ; // you know... dump something somewhere...
    }
    if (sess.isOpen()) {
        for (i = 0; i < 10 && !bWriteSucceeded; i++) {
            try {
                // Crap. Sometimes getting this:
                // The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid
                // state for called method
                basicRemote.sendText(msg);
                bWriteSucceeded = true;
            } catch (IOException e) {
                // Enhance the auto-generated catch block to try again...
                // TODO: check for if (e == java.io.EOFException))
                if (i < 10 && !bWriteSucceeded) {
                    msleep(20);
                    System.out.println("Write tried:" + i + "times and failed.");
                    continue;
                } // Admit failure.
                System.out.println("Write failed: " + i + " retries. Dumping stackTrace");
                e.printStackTrace();
            }
        }
    }
    // succeed on first time and say nothing...
    if (bWriteSucceeded && i > 0)
        System.out.println("Write took " + i + " tries to succeed.");
    else
        System.out.println("Write failed after " + i + " retries.");
}