Http2ConnectionHandler.BaseBuilder exception cleanup

Motivation:
Http2ConnectionHandler.BaseBuilder is constructing objects which have 'close' methods, but is not calling these methods in the event of an exception.

Modifications:
- Objects which implement 'close' should have this method called if an exception is thrown and the build operation can not complete normally.

Result:
Objects are closed even if the build process encounters an error.
This commit is contained in:
Scott Mitchell 2015-10-23 14:03:08 -07:00
parent c6474f9218
commit d66520db1b

View File

@ -191,6 +191,8 @@ public class Http2ConnectionHandler extends ByteToMessageDecoder implements Http
Http2ConnectionEncoder encoder = new DefaultHttp2ConnectionEncoder(connection, writer); Http2ConnectionEncoder encoder = new DefaultHttp2ConnectionEncoder(connection, writer);
if (encoderEnforceMaxConcurrentStreams) { if (encoderEnforceMaxConcurrentStreams) {
if (connection.isServer()) { if (connection.isServer()) {
encoder.close();
reader.close();
throw new IllegalArgumentException( throw new IllegalArgumentException(
"encoderEnforceMaxConcurrentStreams: " + encoderEnforceMaxConcurrentStreams + "encoderEnforceMaxConcurrentStreams: " + encoderEnforceMaxConcurrentStreams +
" not supported for server"); " not supported for server");
@ -210,8 +212,15 @@ public class Http2ConnectionHandler extends ByteToMessageDecoder implements Http
* {@link #encoderEnforceMaxConcurrentStreams(boolean)} (int)}</li></ul> * {@link #encoderEnforceMaxConcurrentStreams(boolean)} (int)}</li></ul>
*/ */
public final T build(Http2ConnectionDecoder decoder, Http2ConnectionEncoder encoder) { public final T build(Http2ConnectionDecoder decoder, Http2ConnectionEncoder encoder) {
// Call the abstract build method final T handler;
T handler = build0(decoder, encoder); try {
// Call the abstract build method
handler = build0(decoder, encoder);
} catch (RuntimeException e) {
encoder.close();
decoder.close();
throw e;
}
// Setup post build options // Setup post build options
handler.gracefulShutdownTimeoutMillis(gracefulShutdownTimeoutMillis); handler.gracefulShutdownTimeoutMillis(gracefulShutdownTimeoutMillis);