最近项目中要定时向前台web页面推送消息,便用websocket来做消息推送。
websocket session发送文本消息有两个方法:getAsyncRemote()和getBasicRemote() 同事推荐使用getAsyncRemote()这个方法,网上找了下解释:就是getAsyncRemote是 非阻塞式 的,getBasicRemote是 阻塞式 的,表示不懂。推送消息的过程中遇到了一个bug,CSDN的一位网友正好遇到过这个bug, 于是顺便把getAsyncRemote()和getBasicRemote() 的区别给请教了一下,那位网友是这样解释的:
getAsyncRemote()和getBasicRemote()确实是异步与同步的区别,大部分情况下,推荐使用getAsyncRemote()。由于getBasicRemote()的同步特性,并且它支持部分消息的发送即sendText(xxx,boolean isLast). isLast的值表示是否一次发送消息中的部分消息,对于如下情况:
session.getBasicRemote().sendText(message, false);
session.getBasicRemote().sendBinary(data);
session.getBasicRemote().sendText(message, true);
由于同步特性,第二行的消息必须等待第一行的发送完成才能进行,而第一行的剩余部分消息要等第二行发送完才能继续发送,所以在第二行会抛出IllegalStateException异常。如果要使用getBasicRemote()同步发送消息,则避免尽量一次发送全部消息,使用部分消息来发送。