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:io.jsync.net.impl.DefaultNetSocket.java

License:Open Source License

@Override
public NetSocket ssl(final Handler<Void> handler) {
    SslHandler sslHandler = channel.pipeline().get(SslHandler.class);
    if (sslHandler == null) {
        sslHandler = helper.createSslHandler(async, client);
        channel.pipeline().addFirst(sslHandler);
    }/*from  w w  w  .  ja va  2  s.  com*/
    sslHandler.handshakeFuture().addListener(new GenericFutureListener<Future<Channel>>() {
        @Override
        public void operationComplete(final Future<Channel> future) throws Exception {
            if (context.isOnCorrectWorker(channel.eventLoop())) {
                if (future.isSuccess()) {
                    try {
                        async.setContext(context);
                        handler.handle(null);
                    } catch (Throwable t) {
                        context.reportException(t);
                    }
                } else {
                    context.reportException(future.cause());
                }

            } else {
                context.execute(new Runnable() {
                    public void run() {
                        if (future.isSuccess()) {
                            handler.handle(null);
                        } else {
                            context.reportException(future.cause());
                        }
                    }
                });
            }
        }
    });
    return this;
}

From source file:io.pravega.client.netty.impl.ClientConnectionInboundHandler.java

License:Open Source License

@Override
public void sendAsync(List<Append> appends, CompletedCallback callback) {
    recentMessage.set(true);//from   w  w w .  ja va  2s.c om
    Channel channel = getChannel();
    ChannelPromise promise = channel.newPromise();
    for (Append append : appends) {
        batchSizeTracker.recordAppend(append.getEventNumber(), append.getData().readableBytes());
        channel.write(append, promise);
    }
    channel.flush();
    promise.addListener(new GenericFutureListener<Future<? super Void>>() {
        @Override
        public void operationComplete(Future<? super Void> future) throws Exception {
            callback.complete(new ConnectionFailedException(future.cause()));
        }
    });
}

From source file:io.reactivex.netty.client.ClientChannelFactoryImpl.java

License:Apache License

@Override
public ChannelFuture connect(final Subscriber<? super ObservableConnection<I, O>> subscriber,
        RxClient.ServerInfo serverInfo,//from  w w  w. ja  v  a  2 s .  c o  m
        final ClientConnectionFactory<I, O, ? extends ObservableConnection<I, O>> connectionFactory) {
    final long startTimeMillis = Clock.newStartTimeMillis();
    eventsSubject.onEvent(ClientMetricsEvent.CONNECT_START);
    final ChannelFuture connectFuture = clientBootstrap.connect(serverInfo.getHost(), serverInfo.getPort());

    subscriber.add(Subscriptions.create(new Action0() {
        @Override
        public void call() {
            if (!connectFuture.isDone()) {
                connectFuture.cancel(true); // Unsubscribe here means, no more connection is required. A close on connection is explicit.
            }
        }
    }));

    connectFuture.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) throws Exception {
            try {
                if (!future.isSuccess()) {
                    eventsSubject.onEvent(ClientMetricsEvent.CONNECT_FAILED, Clock.onEndMillis(startTimeMillis),
                            future.cause());
                    subscriber.onError(future.cause());
                } else {
                    eventsSubject.onEvent(ClientMetricsEvent.CONNECT_SUCCESS,
                            Clock.onEndMillis(startTimeMillis));
                    ChannelPipeline pipeline = future.channel().pipeline();
                    ChannelHandlerContext ctx = pipeline.lastContext(); // The connection uses the context for write which should always start from the tail.
                    final ObservableConnection<I, O> newConnection = connectionFactory.newConnection(ctx);
                    ChannelHandler lifecycleHandler = pipeline
                            .get(RxRequiredConfigurator.CONN_LIFECYCLE_HANDLER_NAME);
                    if (null == lifecycleHandler) {
                        onNewConnection(newConnection, subscriber);
                    } else {
                        @SuppressWarnings("unchecked")
                        ConnectionLifecycleHandler<I, O> handler = (ConnectionLifecycleHandler<I, O>) lifecycleHandler;
                        SslHandler sslHandler = pipeline.get(SslHandler.class);
                        if (null == sslHandler) {
                            handler.setConnection(newConnection);
                            onNewConnection(newConnection, subscriber);
                        } else {
                            sslHandler.handshakeFuture()
                                    .addListener(new GenericFutureListener<Future<? super Channel>>() {
                                        @Override
                                        public void operationComplete(Future<? super Channel> future)
                                                throws Exception {
                                            onNewConnection(newConnection, subscriber);
                                        }
                                    });
                        }
                    }
                }
            } catch (Throwable throwable) {
                subscriber.onError(throwable);
            }
        }
    });
    return connectFuture;
}

From source file:io.soliton.protobuf.AbstractRpcServer.java

License:Apache License

/**
 * Stops this server.//from  w w w . j a  va2  s  . com
 * <p/>
 * <p>This is a synchronous operation.</p>
 */
public void shutDown() {
    logger.info("Shutting down RPC server.");
    channel.close().addListener(new GenericFutureListener<Future<Void>>() {

        @Override
        public void operationComplete(Future<Void> future) throws Exception {
            parentGroup.shutdownGracefully();
            childGroup.shutdownGracefully();
        }
    }).awaitUninterruptibly();
}

From source file:io.soliton.protobuf.json.HttpJsonRpcClient.java

License:Apache License

@Override
public <O extends Message> ListenableFuture<O> encodeMethodCall(final ClientMethod<O> method, Message input) {
    clientLogger.logMethodCall(method);/*from  w  w w  .j a v a 2  s  . co m*/
    final JsonResponseFuture<O> responseFuture = handler.newProvisionalResponse(method);

    JsonObject request = new JsonRpcRequest(method.serviceName(), method.name(),
            new JsonPrimitive(responseFuture.requestId()), Messages.toJson(input)).toJson();

    ByteBuf requestBuffer = Unpooled.buffer();
    JsonWriter writer = new JsonWriter(
            new OutputStreamWriter(new ByteBufOutputStream(requestBuffer), Charsets.UTF_8));
    GSON.toJson(request, writer);
    try {
        writer.flush();
    } catch (IOException ioe) {
        // Deliberately ignored, as this doesn't involve any I/O
    }

    String host = ((InetSocketAddress) channel.remoteAddress()).getAddress().getHostAddress();

    QueryStringEncoder encoder = new QueryStringEncoder(rpcPath);
    encoder.addParam("pp", "0");
    HttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST,
            encoder.toString(), requestBuffer);
    httpRequest.headers().set(HttpHeaders.Names.HOST, host);
    httpRequest.headers().set(HttpHeaders.Names.CONTENT_TYPE, JsonRpcProtocol.CONTENT_TYPE);
    httpRequest.headers().set(HttpHeaders.Names.CONTENT_LENGTH, requestBuffer.readableBytes());

    channel.writeAndFlush(httpRequest).addListener(new GenericFutureListener<ChannelFuture>() {

        public void operationComplete(ChannelFuture future) {
            if (!future.isSuccess()) {
                clientLogger.logLinkError(method, future.cause());
                handler.finish(responseFuture.requestId());
                responseFuture.setException(future.cause());
            }
        }

    });

    return responseFuture;
}

From source file:io.soliton.protobuf.quartz.QuartzClient.java

License:Apache License

/**
 * {@inheritDoc}/*from   w w  w . j a va2 s .c  o m*/
 */
@Override
public <O extends Message> ListenableFuture<O> encodeMethodCall(final ClientMethod<O> method, Message input) {
    // Channel was manually closed earlier
    if (refuseNewRequests.get()) {
        return Futures.immediateFailedFuture(new RuntimeException("Client is closed"));
    }

    // Channel was closed by the server - we make an attempt to reopen.
    if (shouldCreateNewChannel.get()) {
        try {
            reopenChannel();
            channel.closeFuture().addListener(new ChannelCloser());
        } catch (IOException ioe) {
            return Futures.immediateFailedFuture(ioe);
        }
    }

    // Normal operation mode
    clientLogger.logMethodCall(method);
    final EnvelopeFuture<O> output = handler.newProvisionalResponse(method);
    Envelope request = Envelope.newBuilder().setRequestId(output.requestId()).setService(method.serviceName())
            .setMethod(method.name()).setPayload(input.toByteString()).build();

    HttpRequest httpRequest = handler.convertRequest(request);
    channel.writeAndFlush(httpRequest).addListener(new GenericFutureListener<ChannelFuture>() {

        public void operationComplete(ChannelFuture future) {
            if (!future.isSuccess()) {
                clientLogger.logLinkError(method, future.cause());
                handler.finish(output.requestId());
                output.setException(future.cause());
            }
        }

    });

    return output;
}

From source file:io.soliton.protobuf.socket.RpcClient.java

License:Apache License

/**
 * {@inheritDoc}/* w  ww .j  av a2 s  . c  o  m*/
 */
@Override
public <O extends Message> ListenableFuture<O> encodeMethodCall(final ClientMethod<O> method, Message input) {
    clientLogger.logMethodCall(method);
    final EnvelopeFuture<O> output = handler.newProvisionalResponse(method);
    Envelope request = Envelope.newBuilder().setRequestId(output.requestId()).setService(method.serviceName())
            .setMethod(method.name()).setPayload(input.toByteString()).build();
    // TODO(julien): might be nice to couple the future returned from writeAndFlush
    // into the one returned to the user, so that calling cancel on the userland
    // future may also cancel the outgoing request if it isn't done yet.
    channel.writeAndFlush(request).addListener(new GenericFutureListener<ChannelFuture>() {

        public void operationComplete(ChannelFuture future) {
            if (!future.isSuccess()) {
                clientLogger.logLinkError(method, future.cause());
                handler.finish(output.requestId());
                output.setException(future.cause());
            }
        }

    });
    return output;
}

From source file:io.urmia.api.handler.RestApiHandler.java

License:Open Source License

private void handleGET(final ChannelHandlerContext ctx, final ObjectRequest objectRequest) throws Exception {

    log.info("handleGET req: {}", httpRequest);

    mds.list(ctx.executor(), objectRequest).addListener(new GenericFutureListener<Future<ObjectResponse>>() {
        @Override//from  w ww. j  a v  a  2 s  . c o m
        public void operationComplete(Future<ObjectResponse> future) throws Exception {
            if (!future.isSuccess()) {
                log.error("future failed for handleGET: {}", objectRequest, future.cause());
                sendError(ctx, HttpResponseStatus.INTERNAL_SERVER_ERROR);
                return;
            }

            ObjectResponse objectResponse = future.getNow();

            log.info("result of mds.operate: {} -> {}", objectRequest, objectResponse);

            if (objectResponse instanceof ObjectResponse.EmptyResponse) {
                log.info("nothing found at: {}", objectRequest);
                sendError(ctx, HttpResponseStatus.NOT_FOUND);
                return;

            }

            if (objectResponse instanceof ObjectResponse.SingleObject) {
                log.info("GET is for a file. proxy for downloading: {}", objectResponse);
                setupProxyToGET(ctx, ((ObjectResponse.SingleObject) objectResponse).fullObjectName);
                return;

            }

            if (!(objectResponse instanceof ObjectResponse.MultipleObjects)) {
                log.info("multipleObjects.objects is not MultipleObjects: {}", objectResponse);
                sendError(ctx, HttpResponseStatus.NOT_FOUND);
                return;
            }

            log.info("returning result of mds.list: {}", objectResponse.json());
            ctx.writeAndFlush(objectResponse.encode(), ctx.voidPromise());
        }
    });
}

From source file:io.urmia.api.handler.RestApiHandler.java

License:Open Source License

private void handleDELETE(final ChannelHandlerContext ctx, final ObjectRequest request) throws IOException {
    log.info("handleDELETE req: {}", httpRequest);

    mds.delete(ctx.executor(), request).addListener(new GenericFutureListener<Future<ObjectResponse>>() {
        @Override//from ww  w  .ja  va2s  . c  om
        public void operationComplete(Future<ObjectResponse> future) throws Exception {
            if (future.isSuccess()) {
                ObjectResponse response = future.get();
                if (response instanceof ObjectResponse.Failure) {
                    log.warn("error on handleDELETE: {} -> {}", request, response);
                    sendError(ctx, response.encode());
                } else {
                    log.info("successful handleDELETE req: {}, rsp: {}", request, response);
                    ctx.writeAndFlush(response.encode());
                }
            } else {
                log.warn("error on handleDELETE: {}", request, future.cause());
                sendError(ctx, HttpResponseStatus.BAD_REQUEST);
            }
        }
    });

}

From source file:io.urmia.api.handler.RestApiHandler.java

License:Open Source License

private void handleHEAD(final ChannelHandlerContext ctx, final ObjectRequest objectRequest) {

    log.info("handleHEAD uri: {} ", httpRequest.getUri());

    mds.head(ctx.executor(), objectRequest).addListener(new GenericFutureListener<Future<ObjectResponse>>() {
        @Override/*from w  ww.  ja v a  2 s . com*/
        public void operationComplete(Future<ObjectResponse> future) throws Exception {
            if (future.isSuccess()) {
                ObjectResponse objectResponse = future.get();

                log.info("handleHEAD {} -> {}", objectRequest, objectResponse);

                // todo: use .encode()
                if (objectResponse instanceof ObjectResponse.SingleObject) {
                    ObjectResponse.SingleObject singleObject = (ObjectResponse.SingleObject) objectResponse;

                    FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1,
                            HttpResponseStatus.NO_CONTENT);

                    if (singleObject.fullObjectName.attributes.dir) {
                        response.headers().set(CONTENT_TYPE, "application/x-json-stream; type=directory");
                    } else {
                        response.headers().set(CONTENT_MD5, singleObject.fullObjectName.attributes.md5);
                    }

                    ctx.writeAndFlush(response).addListener(new GenericFutureListener<ChannelFuture>() {

                        @Override
                        public void operationComplete(ChannelFuture future) throws Exception {
                            if (future.isSuccess()) {
                                log.info("write success");
                            } else {
                                log.info("write failed: {}", future.cause());
                            }

                        }
                    });

                    return;
                }

                log.warn("error on handleHEAD: {}", objectRequest, future.cause());
                sendError(ctx, ERROR_BAD_REQUEST);
            }
        }
    });

}