Example usage for org.apache.thrift.protocol TProtocol writeMessageEnd

List of usage examples for org.apache.thrift.protocol TProtocol writeMessageEnd

Introduction

In this page you can find the example usage for org.apache.thrift.protocol TProtocol writeMessageEnd.

Prototype

public abstract void writeMessageEnd() throws TException;

Source Link

Usage

From source file:com.facebook.swift.service.ThriftMethodHandler.java

License:Apache License

private void writeArguments(TProtocol out, int sequenceId, Object[] args) throws Exception {
    // Note that though setting message type to ONEWAY can be helpful when looking at packet
    // captures, some clients always send CALL and so servers are forced to rely on the "oneway"
    // attribute on thrift method in the interface definition, rather than checking the message
    // type./*from  www .  j  a  v a2s .com*/
    out.writeMessageBegin(new TMessage(name, oneway ? ONEWAY : CALL, sequenceId));

    // write the parameters
    TProtocolWriter writer = new TProtocolWriter(out);
    writer.writeStructBegin(name + "_args");
    for (int i = 0; i < args.length; i++) {
        Object value = args[i];
        ParameterHandler parameter = parameterCodecs.get(i);
        writer.writeField(parameter.getName(), parameter.getId(), parameter.getCodec(), value);
    }
    writer.writeStructEnd();

    out.writeMessageEnd();
    out.getTransport().flush();
}

From source file:com.facebook.swift.service.ThriftMethodProcessor.java

License:Apache License

private <T> void writeResponse(TProtocol out, int sequenceId, byte responseType, String responseFieldName,
        short responseFieldId, ThriftCodec<T> responseCodec, T result) throws Exception {
    out.writeMessageBegin(new TMessage(name, responseType, sequenceId));

    TProtocolWriter writer = new TProtocolWriter(out);
    writer.writeStructBegin(resultStructName);
    writer.writeField(responseFieldName, (short) responseFieldId, responseCodec, result);
    writer.writeStructEnd();/*from   w  w w . j  a v a  2s . com*/

    out.writeMessageEnd();
    out.getTransport().flush();
}

From source file:com.facebook.swift.service.ThriftServiceProcessor.java

License:Apache License

public static TApplicationException writeApplicationException(TProtocol outputProtocol,
        RequestContext requestContext, String methodName, int sequenceId,
        TApplicationException applicationException) throws TException {
    LOG.error(applicationException, applicationException.getMessage());
    TNiftyTransport requestTransport = requestContext instanceof NiftyRequestContext
            ? ((NiftyRequestContext) requestContext).getNiftyTransport()
            : null;//ww  w . j  a  v a2s . co m

    // Application exceptions are sent to client, and the connection can be reused
    outputProtocol.writeMessageBegin(new TMessage(methodName, TMessageType.EXCEPTION, sequenceId));
    applicationException.write(outputProtocol);
    outputProtocol.writeMessageEnd();
    if (requestTransport != null) {
        requestTransport.setTApplicationException(applicationException);
    }
    outputProtocol.getTransport().flush();

    return applicationException;
}

From source file:com.linecorp.armeria.client.thrift.ThriftClientCodec.java

License:Apache License

@Override
@SuppressWarnings("rawtypes")
public EncodeResult encodeRequest(Channel channel, Method method, Object[] args) {
    requireNonNull(channel, "channel");
    requireNonNull(method, "method");
    final ThriftMethod thriftMethod = methodMap.get(method.getName());
    if (thriftMethod == null) {
        throw new IllegalStateException("Thrift method not found: " + method.getName());
    }/* w  w  w  .  j av  a  2  s  .c om*/
    try {
        final ByteBuf outByteBuf = channel.alloc().buffer();
        final TByteBufOutputTransport outTransport = new TByteBufOutputTransport(outByteBuf);
        final TProtocol tProtocol = protocolFactory.getProtocol(outTransport);
        final TMessage tMessage = new TMessage(method.getName(), thriftMethod.methodType(),
                seq.incrementAndGet());

        tProtocol.writeMessageBegin(tMessage);
        final TBase tArgs = thriftMethod.createArgs(isAsyncClient, args);
        tArgs.write(tProtocol);
        tProtocol.writeMessageEnd();

        AsyncMethodCallback asyncMethodCallback = null;
        if (isAsyncClient) {
            asyncMethodCallback = ThriftMethod.asyncCallback(args);
        }
        return new ThriftInvocation(channel, scheme, uri.getHost(), uri.getPath(), uri.getPath(), loggerName,
                outByteBuf, tMessage, thriftMethod, tArgs, asyncMethodCallback);
    } catch (Exception e) {
        Exception decodedException = decodeException(e, thriftMethod.declaredThrowableException());
        return new ThriftEncodeFailureResult(decodedException, scheme, uri);
    }
}

From source file:com.linecorp.armeria.client.thrift.ThriftClientDelegate.java

License:Apache License

@Override
public ThriftReply execute(ClientRequestContext ctx, ThriftCall call) throws Exception {
    final int seqId = call.seqId();
    final String method = call.method();
    final List<Object> args = call.params();
    final ThriftReply reply = new ThriftReply(seqId);

    ctx.requestLogBuilder().serializationFormat(serializationFormat);
    ctx.requestLogBuilder().attr(RequestLog.RPC_REQUEST).set(call);
    ctx.responseLogBuilder().attr(ResponseLog.RPC_RESPONSE).set(reply);

    final ThriftFunction func;
    try {//from  w ww .j a v a2 s .  c om
        func = metadata(call.serviceType()).function(method);
        if (func == null) {
            throw new IllegalArgumentException("Thrift method not found: " + method);
        }
    } catch (Throwable cause) {
        reply.completeExceptionally(cause);
        return reply;
    }

    try {
        final TMemoryBuffer outTransport = new TMemoryBuffer(128);
        final TProtocol tProtocol = protocolFactory.getProtocol(outTransport);
        final TMessage tMessage = new TMessage(method, func.messageType(), seqId);

        tProtocol.writeMessageBegin(tMessage);
        @SuppressWarnings("rawtypes")
        final TBase tArgs = func.newArgs(args);
        tArgs.write(tProtocol);
        tProtocol.writeMessageEnd();

        final DefaultHttpRequest httpReq = new DefaultHttpRequest(
                HttpHeaders.of(HttpMethod.POST, path).set(HttpHeaderNames.CONTENT_TYPE, mediaType), true);
        httpReq.write(HttpData.of(outTransport.getArray(), 0, outTransport.length()));
        httpReq.close();

        final CompletableFuture<AggregatedHttpMessage> future = httpClient.execute(ctx, httpReq).aggregate();

        future.handle(voidFunction((res, cause) -> {
            if (cause != null) {
                completeExceptionally(reply, func,
                        cause instanceof ExecutionException ? cause.getCause() : cause);
                return;
            }

            final HttpStatus status = res.headers().status();
            if (status.code() != HttpStatus.OK.code()) {
                completeExceptionally(reply, func, new InvalidResponseException(status.toString()));
                return;
            }

            try {
                reply.complete(decodeResponse(func, res.content()));
            } catch (Throwable t) {
                completeExceptionally(reply, func, t);
            }
        })).exceptionally(CompletionActions::log);
    } catch (Throwable cause) {
        completeExceptionally(reply, func, cause);
    }

    return reply;
}

From source file:com.linecorp.armeria.client.thrift.THttpClientDelegate.java

License:Apache License

@Override
public RpcResponse execute(ClientRequestContext ctx, RpcRequest call) throws Exception {
    final int seqId = nextSeqId.incrementAndGet();
    final String method = call.method();
    final List<Object> args = call.params();
    final DefaultRpcResponse reply = new DefaultRpcResponse();

    ctx.logBuilder().serializationFormat(serializationFormat);

    final ThriftFunction func;
    try {//www .  j  a va 2  s .  c om
        func = metadata(call.serviceType()).function(method);
        if (func == null) {
            throw new IllegalArgumentException("Thrift method not found: " + method);
        }
    } catch (Throwable cause) {
        reply.completeExceptionally(cause);
        return reply;
    }

    try {
        final TMemoryBuffer outTransport = new TMemoryBuffer(128);
        final TProtocol tProtocol = protocolFactory.getProtocol(outTransport);
        final TMessage header = new TMessage(fullMethod(ctx, method), func.messageType(), seqId);

        tProtocol.writeMessageBegin(header);
        @SuppressWarnings("rawtypes")
        final TBase tArgs = func.newArgs(args);
        tArgs.write(tProtocol);
        tProtocol.writeMessageEnd();

        ctx.logBuilder().requestContent(call, new ThriftCall(header, tArgs));

        final DefaultHttpRequest httpReq = new DefaultHttpRequest(
                HttpHeaders.of(HttpMethod.POST, path).set(HttpHeaderNames.CONTENT_TYPE, mediaType), true);
        httpReq.write(HttpData.of(outTransport.getArray(), 0, outTransport.length()));
        httpReq.close();

        ctx.logBuilder().deferResponseContent();

        final CompletableFuture<AggregatedHttpMessage> future = httpClient.execute(ctx, httpReq).aggregate();

        future.handle(voidFunction((res, cause) -> {
            if (cause != null) {
                handlePreDecodeException(ctx, reply, func,
                        cause instanceof ExecutionException ? cause.getCause() : cause);
                return;
            }

            final HttpStatus status = res.headers().status();
            if (status.code() != HttpStatus.OK.code()) {
                handlePreDecodeException(ctx, reply, func, new InvalidResponseException(status.toString()));
                return;
            }

            try {
                handle(ctx, reply, func, res.content());
            } catch (Throwable t) {
                handlePreDecodeException(ctx, reply, func, t);
            }
        })).exceptionally(CompletionActions::log);
    } catch (Throwable cause) {
        handlePreDecodeException(ctx, reply, func, cause);
    }

    return reply;
}

From source file:com.linecorp.armeria.server.thrift.ThriftServiceCodec.java

License:Apache License

private ByteBuf encodeSuccess(ThriftServiceInvocationContext ctx, TBase<TBase<?, ?>, TFieldIdEnum> result) {

    final TProtocol outProto = this.outProto.get();
    final TByteBufTransport outTransport = (TByteBufTransport) outProto.getTransport();
    final ByteBuf out = ctx.alloc().buffer();
    outTransport.reset(out);// w w  w. ja va  2  s  . co  m
    try {
        outProto.writeMessageBegin(new TMessage(ctx.method(), TMessageType.REPLY, ctx.seqId));
        result.write(outProto);
        outProto.writeMessageEnd();
    } catch (TException e) {
        throw new Error(e); // Should never reach here.
    } finally {
        outTransport.clear();
    }

    return out;
}

From source file:com.linecorp.armeria.server.thrift.ThriftServiceCodec.java

License:Apache License

private ByteBuf encodeException(ByteBufAllocator alloc, String methodName, int seqId,
        TApplicationException cause) {//from   w w  w  . ja  va2s .  c om

    final TProtocol outProto = this.outProto.get();
    final TByteBufTransport outTransport = (TByteBufTransport) outProto.getTransport();
    final ByteBuf out = alloc.buffer();

    outTransport.reset(out);
    try {
        outProto.writeMessageBegin(new TMessage(methodName, TMessageType.EXCEPTION, seqId));
        cause.write(outProto);
        outProto.writeMessageEnd();
    } catch (TException e) {
        throw new Error(e); // Should never reach here.
    } finally {
        outTransport.clear();
    }

    return out;
}

From source file:com.linecorp.armeria.server.thrift.THttpService.java

License:Apache License

private static HttpData encodeSuccess(ServiceRequestContext ctx, RpcResponse reply,
        SerializationFormat serializationFormat, String methodName, int seqId,
        TBase<TBase<?, ?>, TFieldIdEnum> result) {

    final TMemoryBuffer buf = new TMemoryBuffer(128);
    final TProtocol outProto = ThriftProtocolFactories.get(serializationFormat).getProtocol(buf);

    try {/*  w  w w .ja v a 2 s  .  c om*/
        final TMessage header = new TMessage(methodName, TMessageType.REPLY, seqId);
        outProto.writeMessageBegin(header);
        result.write(outProto);
        outProto.writeMessageEnd();

        ctx.logBuilder().responseContent(reply, new ThriftReply(header, result));
    } catch (TException e) {
        throw new Error(e); // Should never reach here.
    }

    return HttpData.of(buf.getArray(), 0, buf.length());
}

From source file:com.linecorp.armeria.server.thrift.THttpService.java

License:Apache License

private static HttpData encodeException(ServiceRequestContext ctx, RpcResponse reply,
        SerializationFormat serializationFormat, int seqId, String methodName, Throwable cause) {

    final TApplicationException appException;
    if (cause instanceof TApplicationException) {
        appException = (TApplicationException) cause;
    } else {//from  w  w w . j a  v  a2 s . c o  m
        appException = new TApplicationException(TApplicationException.INTERNAL_ERROR,
                "internal server error:" + System.lineSeparator() + "---- BEGIN server-side trace ----"
                        + System.lineSeparator() + Throwables.getStackTraceAsString(cause)
                        + "---- END server-side trace ----");
    }

    final TMemoryBuffer buf = new TMemoryBuffer(128);
    final TProtocol outProto = ThriftProtocolFactories.get(serializationFormat).getProtocol(buf);

    try {
        final TMessage header = new TMessage(methodName, TMessageType.EXCEPTION, seqId);
        outProto.writeMessageBegin(header);
        appException.write(outProto);
        outProto.writeMessageEnd();

        ctx.logBuilder().responseContent(reply, new ThriftReply(header, appException));
    } catch (TException e) {
        throw new Error(e); // Should never reach here.
    }

    return HttpData.of(buf.getArray(), 0, buf.length());
}