Search in sources :

Example 1 with SocketChannelInputStream

use of org.apache.nifi.remote.io.socket.SocketChannelInputStream in project nifi by apache.

the class AbstractCacheServer method start.

@Override
public void start() throws IOException {
    serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.configureBlocking(true);
    serverSocketChannel.bind(new InetSocketAddress(port));
    final Runnable runnable = new Runnable() {

        @Override
        public void run() {
            while (true) {
                final SocketChannel socketChannel;
                try {
                    socketChannel = serverSocketChannel.accept();
                    logger.debug("Connected to {}", new Object[] { socketChannel });
                } catch (final IOException e) {
                    if (!stopped) {
                        logger.error("{} unable to accept connection from remote peer due to {}", this, e.toString());
                        if (logger.isDebugEnabled()) {
                            logger.error("", e);
                        }
                    }
                    return;
                }
                final Runnable processInputRunnable = new Runnable() {

                    @Override
                    public void run() {
                        final InputStream rawInputStream;
                        final OutputStream rawOutputStream;
                        final String peer = socketChannel.socket().getInetAddress().getHostName();
                        try {
                            if (sslContext == null) {
                                rawInputStream = new SocketChannelInputStream(socketChannel);
                                rawOutputStream = new SocketChannelOutputStream(socketChannel);
                            } else {
                                final SSLSocketChannel sslSocketChannel = new SSLSocketChannel(sslContext, socketChannel, false);
                                sslSocketChannel.connect();
                                rawInputStream = new SSLSocketChannelInputStream(sslSocketChannel);
                                rawOutputStream = new SSLSocketChannelOutputStream(sslSocketChannel);
                            }
                        } catch (IOException e) {
                            logger.error("Cannot create input and/or output streams for {}", new Object[] { identifier }, e);
                            if (logger.isDebugEnabled()) {
                                logger.error("", e);
                            }
                            try {
                                socketChannel.close();
                            } catch (IOException swallow) {
                            }
                            return;
                        }
                        try (final InputStream in = new BufferedInputStream(rawInputStream);
                            final OutputStream out = new BufferedOutputStream(rawOutputStream)) {
                            final VersionNegotiator versionNegotiator = getVersionNegotiator();
                            ProtocolHandshake.receiveHandshake(in, out, versionNegotiator);
                            boolean continueComms = true;
                            while (continueComms) {
                                continueComms = listen(in, out, versionNegotiator.getVersion());
                            }
                            // client has issued 'close'
                            logger.debug("Client issued close on {}", new Object[] { socketChannel });
                        } catch (final SocketTimeoutException e) {
                            logger.debug("30 sec timeout reached", e);
                        } catch (final IOException | HandshakeException e) {
                            if (!stopped) {
                                logger.error("{} unable to communicate with remote peer {} due to {}", new Object[] { this, peer, e.toString() });
                                if (logger.isDebugEnabled()) {
                                    logger.error("", e);
                                }
                            }
                        } finally {
                            processInputThreads.remove(Thread.currentThread());
                        }
                    }
                };
                final Thread processInputThread = new Thread(processInputRunnable);
                processInputThread.setName("Distributed Cache Server Communications Thread: " + identifier);
                processInputThread.setDaemon(true);
                processInputThread.start();
                processInputThreads.add(processInputThread);
            }
        }
    };
    final Thread thread = new Thread(runnable);
    thread.setDaemon(true);
    thread.setName("Distributed Cache Server: " + identifier);
    thread.start();
}
Also used : SSLSocketChannel(org.apache.nifi.remote.io.socket.ssl.SSLSocketChannel) ServerSocketChannel(java.nio.channels.ServerSocketChannel) SocketChannel(java.nio.channels.SocketChannel) SSLSocketChannelOutputStream(org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelOutputStream) SocketChannelOutputStream(org.apache.nifi.remote.io.socket.SocketChannelOutputStream) SSLSocketChannelOutputStream(org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelOutputStream) SSLSocketChannelInputStream(org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelInputStream) InetSocketAddress(java.net.InetSocketAddress) BufferedInputStream(java.io.BufferedInputStream) SocketChannelInputStream(org.apache.nifi.remote.io.socket.SocketChannelInputStream) SSLSocketChannelInputStream(org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelInputStream) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) SocketChannelOutputStream(org.apache.nifi.remote.io.socket.SocketChannelOutputStream) BufferedOutputStream(java.io.BufferedOutputStream) SSLSocketChannelOutputStream(org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelOutputStream) SocketChannelInputStream(org.apache.nifi.remote.io.socket.SocketChannelInputStream) SSLSocketChannelInputStream(org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelInputStream) IOException(java.io.IOException) SSLSocketChannel(org.apache.nifi.remote.io.socket.ssl.SSLSocketChannel) StandardVersionNegotiator(org.apache.nifi.remote.StandardVersionNegotiator) VersionNegotiator(org.apache.nifi.remote.VersionNegotiator) SocketTimeoutException(java.net.SocketTimeoutException) BufferedInputStream(java.io.BufferedInputStream) BufferedOutputStream(java.io.BufferedOutputStream) HandshakeException(org.apache.nifi.distributed.cache.protocol.exception.HandshakeException)

Aggregations

BufferedInputStream (java.io.BufferedInputStream)1 BufferedOutputStream (java.io.BufferedOutputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 OutputStream (java.io.OutputStream)1 InetSocketAddress (java.net.InetSocketAddress)1 SocketTimeoutException (java.net.SocketTimeoutException)1 ServerSocketChannel (java.nio.channels.ServerSocketChannel)1 SocketChannel (java.nio.channels.SocketChannel)1 HandshakeException (org.apache.nifi.distributed.cache.protocol.exception.HandshakeException)1 StandardVersionNegotiator (org.apache.nifi.remote.StandardVersionNegotiator)1 VersionNegotiator (org.apache.nifi.remote.VersionNegotiator)1 SocketChannelInputStream (org.apache.nifi.remote.io.socket.SocketChannelInputStream)1 SocketChannelOutputStream (org.apache.nifi.remote.io.socket.SocketChannelOutputStream)1 SSLSocketChannel (org.apache.nifi.remote.io.socket.ssl.SSLSocketChannel)1 SSLSocketChannelInputStream (org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelInputStream)1 SSLSocketChannelOutputStream (org.apache.nifi.remote.io.socket.ssl.SSLSocketChannelOutputStream)1