Example usage for io.netty.util.concurrent GenericFutureListener GenericFutureListener

List of usage examples for io.netty.util.concurrent GenericFutureListener GenericFutureListener

Introduction

In this page you can find the example usage for io.netty.util.concurrent GenericFutureListener GenericFutureListener.

Prototype

GenericFutureListener

Source Link

Usage

From source file:org.eclipse.moquette.spi.impl.ProtocolProcessor.java

License:Open Source License

/**
 * redis?topicack//from  www .j av  a  2 s.com
 *
 * @param session
 * @param msg
 * @param ackMessage
 */
private void unSubscribeAsync(final ServerChannel session, final UnsubscribeMessage msg,
        final UnsubAckMessage ackMessage) {
    Future<Boolean> f = taskExecutors.submit(new Callable<Boolean>() {

        @Override
        public Boolean call() throws Exception {
            for (String topic : msg.topicFilters()) {
                TopicRouterRepository.clean(topic);
            }
            return true;
        }
    });

    f.addListener(new GenericFutureListener<Future<Boolean>>() {
        @Override
        public void operationComplete(Future<Boolean> future) throws Exception {
            boolean result = future.getNow();
            if (result) {
                session.write(ackMessage);
            }
        }
    });
}

From source file:org.eclipse.moquette.spi.impl.ProtocolProcessor.java

License:Open Source License

/**
 * topicredisack//from  w ww  .j  av  a  2 s  . com
 *
 * @param session
 * @param msg
 * @param ackMessage
 */
private void subscribeAsync(final ServerChannel session, final SubscribeMessage msg,
        final SubAckMessage ackMessage) {
    Future<Boolean> f = taskExecutors.submit(new Callable<Boolean>() {

        @Override
        public Boolean call() throws Exception {
            for (SubscribeMessage.Couple req : msg.subscriptions()) {
                TopicRouterRepository.add(req.getTopicFilter());
            }
            return true;
        }
    });

    f.addListener(new GenericFutureListener<Future<Boolean>>() {
        @Override
        public void operationComplete(Future<Boolean> future) throws Exception {
            boolean result = future.getNow();
            if (result) {
                session.write(ackMessage);
            }
        }
    });
}

From source file:org.eclipse.neoscada.protocol.iec60870.client.Client.java

License:Open Source License

public synchronized ListenableFuture<Void> connect() {
    if (this.connectFuture != null) {
        return this.connectFuture;
    }//from w w  w .j  a  va2s .c  o  m

    final ChannelFuture channelFuture = this.bootstrap.connect(this.address);
    this.connectFuture = SettableFuture.create();

    channelFuture.addListener(new GenericFutureListener<ChannelFuture>() {

        @Override
        public void operationComplete(final ChannelFuture future) throws Exception {
            handleOperationComplete(Client.this.connectFuture, future);
        }
    });

    return this.connectFuture;
}

From source file:org.eclipse.neoscada.protocol.iec60870.client.Client.java

License:Open Source License

@Override
public void close() throws Exception {
    synchronized (this) {
        if (this.channel != null) {
            this.channel.close();
            this.channel = null;
        }/*ww w.j a va2  s . c o m*/

        for (final Module module : this.modules) {
            module.dispose();
        }
    }

    logger.debug("Shutting down main group");
    final Future<?> f = this.group.shutdownGracefully();
    f.addListener(new GenericFutureListener<Future<Object>>() {
        @Override
        public void operationComplete(final Future<Object> arg0) throws Exception {
            disposeExecutor();
        }
    });
}

From source file:org.fiware.kiara.netty.ListenableConstantFutureAdapter.java

License:Open Source License

@Override
public void addListener(final Runnable r, final Executor exctr) {
    future.addListener(new GenericFutureListener() {
        @Override// w w w .j a  v a  2s.  c om
        public void operationComplete(Future future) throws Exception {
            exctr.execute(r);
        }
    });
}

From source file:org.glassfish.jersey.netty.connector.JerseyClientHandler.java

License:Open Source License

@Override
public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) {
    if (msg instanceof HttpResponse) {
        final HttpResponse response = (HttpResponse) msg;

        final ClientResponse jerseyResponse = new ClientResponse(new Response.StatusType() {
            @Override//from w  w  w  .j  a v  a2 s  .  c  o m
            public int getStatusCode() {
                return response.status().code();
            }

            @Override
            public Response.Status.Family getFamily() {
                return Response.Status.Family.familyOf(response.status().code());
            }

            @Override
            public String getReasonPhrase() {
                return response.status().reasonPhrase();
            }
        }, jerseyRequest);

        for (Map.Entry<String, String> entry : response.headers().entries()) {
            jerseyResponse.getHeaders().add(entry.getKey(), entry.getValue());
        }

        // request entity handling.
        if ((response.headers().contains(HttpHeaderNames.CONTENT_LENGTH)
                && HttpUtil.getContentLength(response) > 0) || HttpUtil.isTransferEncodingChunked(response)) {

            ctx.channel().closeFuture().addListener(new GenericFutureListener<Future<? super Void>>() {
                @Override
                public void operationComplete(Future<? super Void> future) throws Exception {
                    isList.add(NettyInputStream.END_OF_INPUT_ERROR);
                }
            });

            jerseyResponse.setEntityStream(new NettyInputStream(isList));
        } else {
            jerseyResponse.setEntityStream(new InputStream() {
                @Override
                public int read() throws IOException {
                    return -1;
                }
            });
        }

        if (asyncConnectorCallback != null) {
            connector.executorService.execute(new Runnable() {
                @Override
                public void run() {
                    asyncConnectorCallback.response(jerseyResponse);
                    future.complete(jerseyResponse);
                }
            });
        }

    }
    if (msg instanceof HttpContent) {

        HttpContent httpContent = (HttpContent) msg;

        ByteBuf content = httpContent.content();

        if (content.isReadable()) {
            // copy bytes - when netty reads last chunk, it automatically closes the channel, which invalidates all
            // relates ByteBuffs.
            byte[] bytes = new byte[content.readableBytes()];
            content.getBytes(content.readerIndex(), bytes);
            isList.add(new ByteArrayInputStream(bytes));
        }

        if (msg instanceof LastHttpContent) {
            isList.add(NettyInputStream.END_OF_INPUT);
        }
    }
}

From source file:org.glassfish.jersey.netty.connector.NettyConnector.java

License:Open Source License

@Override
public Future<?> apply(final ClientRequest jerseyRequest, final AsyncConnectorCallback jerseyCallback) {

    final CompletableFuture<Object> settableFuture = new CompletableFuture<>();

    final URI requestUri = jerseyRequest.getUri();
    String host = requestUri.getHost();
    int port = requestUri.getPort() != -1 ? requestUri.getPort()
            : "https".equals(requestUri.getScheme()) ? 443 : 80;

    try {/*  w  w  w  .j  av  a  2 s.c o m*/
        Bootstrap b = new Bootstrap();
        b.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                ChannelPipeline p = ch.pipeline();

                // Enable HTTPS if necessary.
                if ("https".equals(requestUri.getScheme())) {
                    // making client authentication optional for now; it could be extracted to configurable property
                    JdkSslContext jdkSslContext = new JdkSslContext(client.getSslContext(), true,
                            ClientAuth.NONE);
                    p.addLast(jdkSslContext.newHandler(ch.alloc()));
                }

                // http proxy
                Configuration config = jerseyRequest.getConfiguration();
                final Object proxyUri = config.getProperties().get(ClientProperties.PROXY_URI);
                if (proxyUri != null) {
                    final URI u = getProxyUri(proxyUri);

                    final String userName = ClientProperties.getValue(config.getProperties(),
                            ClientProperties.PROXY_USERNAME, String.class);
                    final String password = ClientProperties.getValue(config.getProperties(),
                            ClientProperties.PROXY_PASSWORD, String.class);

                    p.addLast(new HttpProxyHandler(
                            new InetSocketAddress(u.getHost(), u.getPort() == -1 ? 8080 : u.getPort()),
                            userName, password));
                }

                p.addLast(new HttpClientCodec());
                p.addLast(new ChunkedWriteHandler());
                p.addLast(new HttpContentDecompressor());
                p.addLast(new JerseyClientHandler(NettyConnector.this, jerseyRequest, jerseyCallback,
                        settableFuture));
            }
        });

        // connect timeout
        Integer connectTimeout = ClientProperties.getValue(jerseyRequest.getConfiguration().getProperties(),
                ClientProperties.CONNECT_TIMEOUT, 0);
        if (connectTimeout > 0) {
            b.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectTimeout);
        }

        // Make the connection attempt.
        final Channel ch = b.connect(host, port).sync().channel();

        // guard against prematurely closed channel
        final GenericFutureListener<io.netty.util.concurrent.Future<? super Void>> closeListener = new GenericFutureListener<io.netty.util.concurrent.Future<? super Void>>() {
            @Override
            public void operationComplete(io.netty.util.concurrent.Future<? super Void> future)
                    throws Exception {
                if (!settableFuture.isDone()) {
                    settableFuture.completeExceptionally(new IOException("Channel closed."));
                }
            }
        };

        ch.closeFuture().addListener(closeListener);

        HttpRequest nettyRequest;

        if (jerseyRequest.hasEntity()) {
            nettyRequest = new DefaultHttpRequest(HttpVersion.HTTP_1_1,
                    HttpMethod.valueOf(jerseyRequest.getMethod()), requestUri.getRawPath());
        } else {
            nettyRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1,
                    HttpMethod.valueOf(jerseyRequest.getMethod()), requestUri.getRawPath());
        }

        // headers
        for (final Map.Entry<String, List<String>> e : jerseyRequest.getStringHeaders().entrySet()) {
            nettyRequest.headers().add(e.getKey(), e.getValue());
        }

        // host header - http 1.1
        nettyRequest.headers().add(HttpHeaderNames.HOST, jerseyRequest.getUri().getHost());

        if (jerseyRequest.hasEntity()) {
            if (jerseyRequest.getLengthLong() == -1) {
                HttpUtil.setTransferEncodingChunked(nettyRequest, true);
            } else {
                nettyRequest.headers().add(HttpHeaderNames.CONTENT_LENGTH, jerseyRequest.getLengthLong());
            }
        }

        if (jerseyRequest.hasEntity()) {
            // Send the HTTP request.
            ch.writeAndFlush(nettyRequest);

            final JerseyChunkedInput jerseyChunkedInput = new JerseyChunkedInput(ch);
            jerseyRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() {
                @Override
                public OutputStream getOutputStream(int contentLength) throws IOException {
                    return jerseyChunkedInput;
                }
            });

            if (HttpUtil.isTransferEncodingChunked(nettyRequest)) {
                ch.write(new HttpChunkedInput(jerseyChunkedInput));
            } else {
                ch.write(jerseyChunkedInput);
            }

            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    // close listener is not needed any more.
                    ch.closeFuture().removeListener(closeListener);

                    try {
                        jerseyRequest.writeEntity();
                    } catch (IOException e) {
                        jerseyCallback.failure(e);
                        settableFuture.completeExceptionally(e);
                    }
                }
            });

            ch.flush();
        } else {
            // close listener is not needed any more.
            ch.closeFuture().removeListener(closeListener);

            // Send the HTTP request.
            ch.writeAndFlush(nettyRequest);
        }

    } catch (InterruptedException e) {
        settableFuture.completeExceptionally(e);
        return settableFuture;
    }

    return settableFuture;
}

From source file:org.glassfish.jersey.netty.httpserver.JerseyHttp2ServerHandler.java

License:Open Source License

/**
 * Create Jersey {@link ContainerRequest} based on Netty {@link HttpRequest}.
 *
 * @param ctx          Netty channel context.
 * @param http2Headers Netty Http/2 headers.
 * @return created Jersey Container Request.
 */// w  w  w .  j  a v  a 2 s  .com
private ContainerRequest createContainerRequest(ChannelHandlerContext ctx, Http2HeadersFrame http2Headers) {

    String path = http2Headers.headers().path().toString();

    String s = path.startsWith("/") ? path.substring(1) : path;
    URI requestUri = URI.create(baseUri + ContainerUtils.encodeUnsafeCharacters(s));

    ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri,
            http2Headers.headers().method().toString(), getSecurityContext(), new PropertiesDelegate() {

                private final Map<String, Object> properties = new HashMap<>();

                @Override
                public Object getProperty(String name) {
                    return properties.get(name);
                }

                @Override
                public Collection<String> getPropertyNames() {
                    return properties.keySet();
                }

                @Override
                public void setProperty(String name, Object object) {
                    properties.put(name, object);
                }

                @Override
                public void removeProperty(String name) {
                    properties.remove(name);
                }
            });

    // request entity handling.
    if (!http2Headers.isEndStream()) {

        ctx.channel().closeFuture().addListener(new GenericFutureListener<Future<? super Void>>() {
            @Override
            public void operationComplete(Future<? super Void> future) throws Exception {
                isList.add(NettyInputStream.END_OF_INPUT_ERROR);
            }
        });

        requestContext.setEntityStream(new NettyInputStream(isList));
    } else {
        requestContext.setEntityStream(new InputStream() {
            @Override
            public int read() throws IOException {
                return -1;
            }
        });
    }

    // copying headers from netty request to jersey container request context.
    for (CharSequence name : http2Headers.headers().names()) {
        requestContext.headers(name.toString(), mapToString(http2Headers.headers().getAll(name)));
    }

    return requestContext;
}

From source file:org.glassfish.jersey.netty.httpserver.JerseyServerHandler.java

License:Open Source License

/**
 * Create Jersey {@link ContainerRequest} based on Netty {@link HttpRequest}.
 *
 * @param ctx Netty channel context./*  w  w w . j a va  2 s  . co  m*/
 * @param req Netty Http request.
 * @return created Jersey Container Request.
 */
private ContainerRequest createContainerRequest(ChannelHandlerContext ctx, HttpRequest req) {

    String s = req.uri().startsWith("/") ? req.uri().substring(1) : req.uri();
    URI requestUri = URI.create(baseUri + ContainerUtils.encodeUnsafeCharacters(s));

    ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri, req.method().name(),
            getSecurityContext(), new PropertiesDelegate() {

                private final Map<String, Object> properties = new HashMap<>();

                @Override
                public Object getProperty(String name) {
                    return properties.get(name);
                }

                @Override
                public Collection<String> getPropertyNames() {
                    return properties.keySet();
                }

                @Override
                public void setProperty(String name, Object object) {
                    properties.put(name, object);
                }

                @Override
                public void removeProperty(String name) {
                    properties.remove(name);
                }
            });

    // request entity handling.
    if ((req.headers().contains(HttpHeaderNames.CONTENT_LENGTH) && HttpUtil.getContentLength(req) > 0)
            || HttpUtil.isTransferEncodingChunked(req)) {

        ctx.channel().closeFuture().addListener(new GenericFutureListener<Future<? super Void>>() {
            @Override
            public void operationComplete(Future<? super Void> future) throws Exception {
                isList.add(NettyInputStream.END_OF_INPUT_ERROR);
            }
        });

        requestContext.setEntityStream(new NettyInputStream(isList));
    } else {
        requestContext.setEntityStream(new InputStream() {
            @Override
            public int read() throws IOException {
                return -1;
            }
        });
    }

    // copying headers from netty request to jersey container request context.
    for (String name : req.headers().names()) {
        requestContext.headers(name, req.headers().getAll(name));
    }

    return requestContext;
}

From source file:org.glassfish.jersey.netty.httpserver.NettyHttpContainerProvider.java

License:Open Source License

/**
 * Create and start Netty server.// w ww . ja v a  2 s.  co  m
 *
 * @param baseUri       base uri.
 * @param configuration Jersey configuration.
 * @param sslContext    Netty SSL context (can be null).
 * @param block         when {@code true}, this method will block until the server is stopped. When {@code false}, the
 *                      execution will
 *                      end immediately after the server is started.
 * @return Netty channel instance.
 * @throws ProcessingException when there is an issue with creating new container.
 */
public static Channel createServer(final URI baseUri, final ResourceConfig configuration, SslContext sslContext,
        final boolean block) throws ProcessingException {

    // Configure the server.
    final EventLoopGroup bossGroup = new NioEventLoopGroup(1);
    final EventLoopGroup workerGroup = new NioEventLoopGroup();
    final NettyHttpContainer container = new NettyHttpContainer(configuration);

    try {
        ServerBootstrap b = new ServerBootstrap();
        b.option(ChannelOption.SO_BACKLOG, 1024);
        b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
                .childHandler(new JerseyServerInitializer(baseUri, sslContext, container));

        int port = getPort(baseUri);

        Channel ch = b.bind(port).sync().channel();

        ch.closeFuture().addListener(new GenericFutureListener<Future<? super Void>>() {
            @Override
            public void operationComplete(Future<? super Void> future) throws Exception {
                container.getApplicationHandler().onShutdown(container);

                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            }
        });

        if (block) {
            ch.closeFuture().sync();
            return ch;
        } else {
            return ch;
        }
    } catch (InterruptedException e) {
        throw new ProcessingException(e);
    }
}