diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java index 0388c1104db..5f2d4d1e746 100644 --- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java +++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java @@ -456,9 +456,12 @@ public void close() { || state_ == FrameBufferState.AWAITING_CLOSE) { readBufferBytesAllocated.addAndGet(-buffer_.array().length); } - trans_.close(); - if (eventHandler_ != null) { - eventHandler_.deleteContext(context_, inProt_, outProt_); + try { + if (eventHandler_ != null) { + eventHandler_.deleteContext(context_, inProt_, outProt_); + } + } finally { + trans_.close(); } } diff --git a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java index da82c89a05e..d0edab8e9bf 100644 --- a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java +++ b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java @@ -409,20 +409,23 @@ private void handleWritingResponse() { * selector. */ public void close() { - underlyingTransport.close(); - selectionKey.cancel(); - if (saslPeer != null) { - saslPeer.dispose(); - } - if (serverContextCreated) { - eventHandler.deleteContext( - serverContext, - inputProtocolFactory.getProtocol(underlyingTransport), - outputProtocolFactory.getProtocol(underlyingTransport)); + try { + if (serverContextCreated) { + eventHandler.deleteContext( + serverContext, + inputProtocolFactory.getProtocol(underlyingTransport), + outputProtocolFactory.getProtocol(underlyingTransport)); + } + } finally { + selectionKey.cancel(); + if (saslPeer != null) { + saslPeer.dispose(); + } + nextPhase = Phase.CLOSED; + currentPhase = Phase.CLOSED; + underlyingTransport.close(); + LOGGER.trace("Connection closed: {}", underlyingTransport); } - nextPhase = Phase.CLOSED; - currentPhase = Phase.CLOSED; - LOGGER.trace("Connection closed: {}", underlyingTransport); } public enum Phase {