您可以创建一个Writer包装器实现来跟踪上次刷新通话时间戳.一个快速的实现是添加一个等待呼叫,以符合两个连续刷新之间的150 ms延迟.
public class ControlledFlushWriter extends Writer {
private long enforcedDelay = 150;
private long lastFlush = 0;
private Writer delegated;
public ControlledFlushWriter(Writer writer, long flushDelay) {
this.delegated = writer:
this.enforcedDelay = flushDelay;
}
/* simple delegation for other abstract methods... */
public void flush() {
long now = System.currentTimeMillis();
if (now < lastFlush + enforcedDelay) {
try {
Thread.sleep(lastFlush + enforcedDelay - now);
} catch (InterruptedException e) {
// probably prefer to give up flushing
// instead of risking a connection reset !
return;
}
}
lastFlush = System.currentTimeMillis();
this.delegated.flush();
}
}
现在应该足够将现有的PrintWriter与此ControlledFlushWriter包起来,以解决您的ISP QoS,而无需重新编写所有应用程序.
毕竟,防止连接将其任何分组标记为紧急情况是合理的…在这种情况下,很难实现公平的QoS链路共享.