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());

   }

  }

 }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值