()
| 692 | } |
| 693 | |
| 694 | private void realClose() { |
| 695 | if ((byte)closedHandle.getAndSet(this, (byte)REAL_CLOSED) == REAL_CLOSED) // 阻止递归关闭 |
| 696 | return; |
| 697 | try { |
| 698 | selectionKey.channel().close(); |
| 699 | } catch (Exception e) { |
| 700 | logger.error("SocketChannel.close exception:", e); |
| 701 | } |
| 702 | selector.addTask(() -> { // 进selector线程调用 |
| 703 | if (outputBuffer != null) |
| 704 | outputBuffer.close(); |
| 705 | try { |
| 706 | getService().OnSocketDisposed(this); |
| 707 | } catch (Exception e) { |
| 708 | logger.error("service.OnSocketDisposed exception:", e); |
| 709 | } |
| 710 | }); |
| 711 | selector.wakeup(); |
| 712 | if (timeThrottle != null) |
| 713 | timeThrottle.close(); |
| 714 | } |
| 715 | |
| 716 | @Override |
| 717 | public boolean close(@Nullable Throwable ex, boolean gracefully) { |
no test coverage detected