private void stopConfiguration() throws Exception { if (configuration == null) { // abort received but script not prepared, therefore entire script failed if (progress == null) { progress = new ScriptProgress(newSequential(0, 0), ""); } RegionInfo scriptInfo = progress.getScriptInfo(); progress.addScriptFailure(scriptInfo); } else { // stopping the configuration will implicitly trigger the script complete listener // to handle incomplete script that is being aborted by canceling the finish future // clear out the pipelines for new connections to avoid impacting the observed script for (ServerBootstrapResolver serverResolver : configuration.getServerResolvers()) { ServerBootstrap server = serverResolver.resolve(); server.setPipelineFactory(pipelineFactory(pipeline(closeOnExceptionHandler))); } for (ClientBootstrapResolver clientResolver : configuration.getClientResolvers()) { ClientBootstrap client = clientResolver.resolve(); client.setPipelineFactory(pipelineFactory(pipeline(closeOnExceptionHandler))); } // remove each handler from the configuration pipelines // this will trigger failures for any handlers on a pipeline for an incomplete stream // including pipelines not yet associated with any channel for (ChannelPipeline pipeline : configuration.getClientAndServerPipelines()) { stopStream(pipeline); } // cancel any pending binds and connects for (ChannelFuture bindFuture : bindFutures) { bindFuture.cancel(); } for (ChannelFuture connectFuture : connectFutures) { connectFuture.cancel(); } // close server and client channels final ChannelGroupFuture closeFuture = serverChannels.close(); closeFuture.addListener( new ChannelGroupFutureListener() { @Override public void operationComplete(final ChannelGroupFuture future) { clientChannels.close(); } }); for (AutoCloseable resource : configuration.getResources()) { try { resource.close(); } catch (Exception e) { // ignore } } } }
protected void nuke() { state = NodeConnectionState.NONE; if (pendingFuture != null) pendingFuture.cancel(); if (nodeChannel != null) nodeChannel.close(); pendingFuture = null; nodeChannel = null; }
@Override public void connect() throws NetworkException { connectLock.lock(); try { if (isAvaliable()) { logger.info("[connect] is connected to remote " + remoteAddress + "."); return; } ChannelFuture future = bootstrap.connect(remoteAddress); try { if (future.awaitUninterruptibly(timeout, TimeUnit.MILLISECONDS)) { if (future.isSuccess()) { disConnect(); this.channel = future.getChannel(); localAddress = (InetSocketAddress) this.channel.getLocalAddress(); } else { logger.info("[connect] connected to remote " + remoteAddress + " failed."); throw new NetworkException("connected to remote " + remoteAddress + " failed."); } } else { logger.info("[connect] timeout connecting to remote " + remoteAddress + "."); throw new NetworkException("timeout connecting to remote " + remoteAddress + "."); } } catch (Throwable e) { logger.info("[connect] error connecting to remote " + remoteAddress + ".", e); throw new NetworkException("error connecting to remote " + remoteAddress + ".", e); } finally { if (!isConnected()) { future.cancel(); } } } finally { connectLock.unlock(); } }