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.");
}