use of com.alipay.sofa.rpc.codec.Serializer in project sofa-rpc by sofastack.
the class SofaRpcSerialization method serializeContent.
@Override
public <Request extends RequestCommand> boolean serializeContent(Request request, InvokeContext invokeContext) throws SerializationException {
if (request instanceof RpcRequestCommand) {
RpcRequestCommand requestCommand = (RpcRequestCommand) request;
Object requestObject = requestCommand.getRequestObject();
byte serializerCode = requestCommand.getSerializer();
long serializeStartTime = System.nanoTime();
try {
Map<String, String> header = (Map<String, String>) requestCommand.getRequestHeader();
if (header == null) {
header = new HashMap<String, String>();
}
putKV(header, RemotingConstants.HEAD_GENERIC_TYPE, (String) invokeContext.get(RemotingConstants.HEAD_GENERIC_TYPE));
Serializer rpcSerializer = com.alipay.sofa.rpc.codec.SerializerFactory.getSerializer(serializerCode);
AbstractByteBuf byteBuf = rpcSerializer.encode(requestObject, header);
request.setContent(byteBuf.array());
return true;
} catch (Exception ex) {
throw new SerializationException(ex.getMessage(), ex);
} finally {
// R5:record request serialization time
recordSerializeRequest(requestCommand, invokeContext, serializeStartTime);
}
}
return false;
}
use of com.alipay.sofa.rpc.codec.Serializer in project sofa-rpc by sofastack.
the class SofaRpcSerialization method serializeContent.
@Override
public <Response extends ResponseCommand> boolean serializeContent(Response response) throws SerializationException {
if (response instanceof RpcResponseCommand) {
RpcResponseCommand responseCommand = (RpcResponseCommand) response;
byte serializerCode = response.getSerializer();
long serializeStartTime = System.nanoTime();
try {
Serializer rpcSerializer = com.alipay.sofa.rpc.codec.SerializerFactory.getSerializer(serializerCode);
AbstractByteBuf byteBuf = rpcSerializer.encode(responseCommand.getResponseObject(), null);
responseCommand.setContent(byteBuf.array());
return true;
} catch (Exception ex) {
String traceId = (String) RpcInternalContext.getContext().getAttachment("_trace_id");
String rpcId = (String) RpcInternalContext.getContext().getAttachment("_span_id");
LOGGER.error("traceId={}, rpcId={}, Response serializeContent exception, msg = {}", traceId, rpcId, ex.getMessage(), ex);
throw new SerializationException(ex.getMessage() + ", traceId=" + traceId + ", rpcId=" + rpcId, ex);
} finally {
// R6:Record response serialization time
recordSerializeResponse(responseCommand, serializeStartTime);
}
}
return false;
}
use of com.alipay.sofa.rpc.codec.Serializer in project sofa-rpc by sofastack.
the class AbstractHttpClientHandler method decode.
protected void decode(SofaResponse response) {
AbstractByteBuf byteBuffer = response.getData();
if (byteBuffer != null) {
try {
Map<String, String> context = new HashMap<String, String>(4);
if (response.isError()) {
context.put(RemotingConstants.HEAD_RESPONSE_ERROR, response.isError() + "");
String errorMsg = StringSerializer.decode(byteBuffer.array());
response.setAppResponse(new SofaRpcException(RpcErrorType.SERVER_UNDECLARED_ERROR, errorMsg));
} else {
context.put(RemotingConstants.HEAD_TARGET_SERVICE, request.getTargetServiceUniqueName());
context.put(RemotingConstants.HEAD_METHOD_NAME, request.getMethodName());
Serializer serializer = SerializerFactory.getSerializer(response.getSerializeType());
serializer.decode(byteBuffer, response, context);
}
} finally {
byteBuffer.release();
response.setData(null);
}
}
}
use of com.alipay.sofa.rpc.codec.Serializer in project sofa-rpc by sofastack.
the class TripleClientInvoker method invoke.
@Override
public SofaResponse invoke(SofaRequest sofaRequest, int timeout) throws Exception {
if (!useGeneric) {
SofaResponse sofaResponse = new SofaResponse();
Object stub = sofaStub.invoke(null, channel, buildCustomCallOptions(sofaRequest, timeout), timeout);
final Method method = sofaRequest.getMethod();
Object appResponse = method.invoke(stub, sofaRequest.getMethodArgs()[0]);
sofaResponse.setAppResponse(appResponse);
return sofaResponse;
} else {
String serviceName = sofaRequest.getInterfaceName();
String methodName = sofaRequest.getMethodName();
MethodDescriptor.Marshaller<?> requestMarshaller = null;
MethodDescriptor.Marshaller<?> responseMarshaller = null;
requestMarshaller = io.grpc.protobuf.ProtoUtils.marshaller(Request.getDefaultInstance());
responseMarshaller = io.grpc.protobuf.ProtoUtils.marshaller(Response.getDefaultInstance());
String fullMethodName = generateFullMethodName(serviceName, methodName);
MethodDescriptor methodDescriptor = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(fullMethodName).setSampledToLocalTracing(true).setRequestMarshaller((MethodDescriptor.Marshaller<Object>) requestMarshaller).setResponseMarshaller((MethodDescriptor.Marshaller<Object>) responseMarshaller).build();
Request request = getRequest(sofaRequest, serialization, serializer);
Response response = (Response) ClientCalls.blockingUnaryCall(channel, methodDescriptor, buildCustomCallOptions(sofaRequest, timeout), request);
SofaResponse sofaResponse = new SofaResponse();
byte[] responseDate = response.getData().toByteArray();
Class returnType = sofaRequest.getMethod().getReturnType();
if (returnType != void.class) {
if (responseDate != null && responseDate.length > 0) {
Serializer responseSerializer = SerializerFactory.getSerializer(response.getSerializeType());
Object appResponse = responseSerializer.decode(new ByteArrayWrapperByteBuf(responseDate), returnType, null);
sofaResponse.setAppResponse(appResponse);
}
}
return sofaResponse;
}
}
use of com.alipay.sofa.rpc.codec.Serializer in project sofa-rpc by sofastack.
the class GenericServiceImplTest method getReturnValue.
private Object getReturnValue(Method method) {
Object appResponse = null;
Response response = responseObserver.getValue();
byte[] responseDate = response.getData().toByteArray();
Class returnType = method.getReturnType();
if (returnType != void.class) {
if (responseDate != null && responseDate.length > 0) {
Serializer responseSerializer = SerializerFactory.getSerializer(response.getSerializeType());
appResponse = responseSerializer.decode(new ByteArrayWrapperByteBuf(responseDate), returnType, null);
}
}
return appResponse;
}
Aggregations