| 321 | } |
| 322 | |
| 323 | @Override |
| 324 | public void close() { |
| 325 | lock(); |
| 326 | try { |
| 327 | task11Executor.shutdown(true); |
| 328 | if (scheduler == null) |
| 329 | return; |
| 330 | Netty.logger.info("close {}", getClass().getName()); |
| 331 | scheduler.cancel(true); |
| 332 | scheduler = null; |
| 333 | exchanges.values().forEach(HttpExchange::closeConnectionNow); |
| 334 | exchanges.clear(); |
| 335 | if (channelFuture != null) { |
| 336 | var ch = channelFuture.channel(); |
| 337 | channelFuture = null; |
| 338 | if (ch != null) |
| 339 | ch.close(); |
| 340 | } |
| 341 | if (httpSession != null) |
| 342 | httpSession.stop(); |
| 343 | } finally { |
| 344 | unlock(); |
| 345 | } |
| 346 | } |
| 347 | |
| 348 | // 这是一个低开销的检测空闲超时的方法,不准确但只会比预设的超时时间长,写超时可能会多出readIdleTimeout的时长 |
| 349 | protected void checkTimeout(@NotNull Channel channel) { |