private Future<NetconfClientSession> createSshClient(final NetconfClientConfiguration currentConfiguration) { LOG.debug("Creating SSH client with configuration: {}", currentConfiguration); return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(), new PipelineInitializer<NetconfClientSession>() { @Override public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> sessionPromise) { new SshClientChannelInitializer(currentConfiguration.getAuthHandler(), getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener()) .initialize(ch, sessionPromise); } }); }
private Future<NetconfClientSession> createTcpClient(final NetconfClientConfiguration currentConfiguration) { LOG.debug("Creating TCP client with configuration: {}", currentConfiguration); return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(), new PipelineInitializer<NetconfClientSession>() { @Override public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) { initialize(ch, promise); } private void initialize(final SocketChannel ch, final Promise<NetconfClientSession> promise) { new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration), currentConfiguration .getSessionListener()).initialize(ch, promise); } }); }
synchronized void connect() { final ReconnectStrategy cs = this.strategyFactory.createReconnectStrategy(); // Set up a client with pre-configured bootstrap, but add a closed channel handler into the pipeline to support reconnect attempts pending = this.dispatcher.createClient(this.address, cs, b, new AbstractDispatcher.PipelineInitializer<S>() { @Override public void initializeChannel(final SocketChannel channel, final Promise<S> promise) { initializer.initializeChannel(channel, promise); // add closed channel handler // This handler has to be added as last channel handler and the channel inactive event has to be caught by it // Handlers in front of it can react to channelInactive event, but have to forward the event or the reconnect will not work // This handler is last so all handlers in front of it can handle channel inactive (to e.g. resource cleanup) before a new connection is started channel.pipeline().addLast(new ClosedChannelHandler(ReconnectPromise.this)); } }); pending.addListener(new GenericFutureListener<Future<Object>>() { @Override public void operationComplete(Future<Object> future) throws Exception { if (!future.isSuccess()) { ReconnectPromise.this.setFailure(future.cause()); } } }); }