失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > WebSocket异常:The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for calle

WebSocket异常:The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for calle

时间:2022-04-11 14:37:29

相关推荐

WebSocket异常:The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for calle

WebSocket异常:The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method

项目中websocket,sendMessage出现异常。

代码:

this.session.getAsyncRemote().sendText(text);

原因:

一种是,onMessage方法有返回值,导致onMessage无法被sync block控制。

一种是,session没有被同步控制,导致多线程情况下,出现IllegalStateException

保证以上两点之后

使用session.getBasicRemote()应该是没有问题的。

方案:

方案1:同步控制 + 异步发送

public void sendMsg(String text) {

log.info("即将推送消息给客户:" + text);

if (!this.session.isOpen()) {

log.error("消息推送失败,session 处于关闭状态:" + session.getId());

return;

}

synchronized (session) {

try {

Thread.sleep(1000 * 5);

} catch (InterruptedException e1) {

e1.printStackTrace();

}

if (this.session.isOpen()) {

try {

this.session.getAsyncRemote().sendText(text);

} catch (IOException e) {

e.printStackTrace();

log.error(e.getMessage());

}

} else {

log.error("消息推送失败,session 处于关闭状态:" + session.getId());

}

}

}

方案2:同步控制 + 同步发送

public void sendMsg(String text) {

log.info("即将推送消息给客户:" + text);

if (!this.session.isOpen()) {

log.error("消息推送失败,session 处于关闭状态:" + session.getId());

return;

}

synchronized (session) {

try {

Thread.sleep(1000 * 5);

} catch (InterruptedException e1) {

e1.printStackTrace();

}

if (this.session.isOpen()) {

// this.session.getAsyncRemote().sendText(text);

try {

this.session.getBasicRemote().sendText(text);

} catch (IOException e) {

e.printStackTrace();

log.error(e.getMessage());

}

} else {

log.error("消息推送失败,session 处于关闭状态:" + session.getId());

}

}

}

如果觉得《WebSocket异常:The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for calle》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。