我正在使用Jetty 9.3和WebSockets API(而不是jsr 356)。
不同的线程可以向同一个会话/端点发送不同的文本消息,我正在尝试同步它,因此当时只有一条消息被发送到同一个会话。
以下是我正在使用的代码:
private final ReentrantLock lock = new ReentrantLock();
public void sendTextMessage(String s){
try {
boolean isLock=this.lock.tryLock(5, TimeUnit.SECONDS);
if(isLock){
this.session.getRemote().sendString(s);
}else{
System.out.println("message not send :"+ip);
}
} catch (IOException e) {
} catch (InterruptedException e) {
}
finally{
if(this.lock.isHeldByCurrentThread())
this.lock.unlock();
}
}
经过一段时间后,一些线程仍然被阻止。这不是很常见。给你一些统计数据:发送17554165条消息 - > 3个线程被阻止。
我做错了吗?有没有更好的方法来实现这个?
是否有可能this.session.getRemote().sendString(s);
未终止并保持线程锁定?