private SofaResponse buildEmptyResponse(SofaRequest request) { SofaResponse response = new SofaResponse(); Method method = request.getMethod(); if (method != null) { response.setAppResponse(ClassUtils.getDefaultPrimitiveValue(method.getReturnType())); } return response; }
@Override protected V getNow() throws ExecutionException { if (cause != null) { // 异常 throw new ExecutionException(cause); } else if (result instanceof SofaResponse) { SofaResponse response = (SofaResponse) result; if (response.isError()) { cause = new SofaRpcException(RpcErrorType.SERVER_UNDECLARED_ERROR, response.getErrorMsg()); throw new ExecutionException(cause); } else { result = response.getAppResponse(); if (result instanceof Throwable) { throw new ExecutionException((Throwable) result); } else { return (V) result; } } } else { return (V) result; } }
@Override public void decodeObjectByTemplate(AbstractByteBuf data, Map<String, String> context, SofaResponse template) throws SofaRpcException { try { UnsafeByteArrayInputStream inputStream = new UnsafeByteArrayInputStream(data.array()); Hessian2Input input = new Hessian2Input(inputStream); // 根据SerializeType信息决定序列化器 boolean genericSerialize = context != null && isGenericResponse( context.get(RemotingConstants.HEAD_GENERIC_TYPE)); if (genericSerialize) { input.setSerializerFactory(genericSerializerFactory); GenericObject genericObject = (GenericObject) input.readObject(); template.setErrorMsg((String) genericObject.getField("errorMsg")); template.setAppResponse(genericObject.getField("appResponse")); template.setResponseProps((Map<String, String>) genericObject.getField("responseProps")); } else { input.setSerializerFactory(serializerFactory); SofaResponse tmp = (SofaResponse) input.readObject(); // copy values to template template.setErrorMsg(tmp.getErrorMsg()); template.setAppResponse(tmp.getAppResponse()); template.setResponseProps(tmp.getResponseProps()); } input.close(); } catch (IOException e) { throw buildDeserializeError(e.getMessage(), e); } }
/** * 构建rpc错误结果 * * @param errorMsg 错误消息 * @return rpc结果 */ public static SofaResponse buildSofaErrorResponse(String errorMsg) { SofaResponse sofaResponse = new SofaResponse(); sofaResponse.setErrorMsg(errorMsg); return sofaResponse; } }
SofaResponse sofaResponse = new SofaResponse(); long startTime = RpcRuntimeContext.now(); try { sofaResponse.setAppResponse(result); } catch (IllegalArgumentException e) { // 非法参数,可能是实现类和接口类不对应) sofaResponse.setErrorMsg(e.getMessage()); } catch (IllegalAccessException e) { // 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的 sofaResponse.setErrorMsg(e.getMessage()); sofaResponse.setAppResponse(e.getCause()); } finally { if (RpcInternalContext.isAttachmentEnable()) {
sofaResponse.setResponseProps(head); sofaResponse.setErrorMsg(errorMessage); } else { sofaResponse.setAppResponse(pbRes);
@Override public SofaResponse decodeObject(AbstractByteBuf data, Map<String, String> context) throws SofaRpcException { try { UnsafeByteArrayInputStream inputStream = new UnsafeByteArrayInputStream(data.array()); Hessian2Input input = new Hessian2Input(inputStream); // 根据SerializeType信息决定序列化器 Object object; boolean genericSerialize = context != null && isGenericResponse( context.get(RemotingConstants.HEAD_GENERIC_TYPE)); if (genericSerialize) { input.setSerializerFactory(genericSerializerFactory); GenericObject genericObject = (GenericObject) input.readObject(); SofaResponse sofaResponse = new SofaResponse(); sofaResponse.setErrorMsg((String) genericObject.getField("errorMsg")); sofaResponse.setAppResponse(genericObject.getField("appResponse")); sofaResponse.setResponseProps((Map<String, String>) genericObject.getField("responseProps")); object = sofaResponse; } else { input.setSerializerFactory(serializerFactory); object = input.readObject(); } input.close(); return (SofaResponse) object; } catch (IOException e) { throw buildDeserializeError(e.getMessage(), e); } }
response.setSerializeType(request.getSerializeType()); if (response.isError()) { ByteBuf content = ctx.alloc().buffer(); content.writeBytes(StringSerializer.encode(response.getErrorMsg())); sendRpcError(status == null ? HttpResponseStatus.INTERNAL_SERVER_ERROR : status, content); } else { if (response.getAppResponse() instanceof Throwable) { ByteBuf content = ctx.alloc().buffer(); String errorMsg = ExceptionUtils.toString((Throwable) response.getAppResponse()); content.writeBytes(StringSerializer.encode(errorMsg)); sendAppError(HttpResponseStatus.OK, content); content.writeBytes(bs.array()); } else { content.writeBytes(StringSerializer.encode(response.getAppResponse().toString()));
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); } } }
@Override public <Response extends ResponseCommand> boolean serializeHeader(Response response) throws SerializationException { if (response instanceof RpcResponseCommand) { RpcInternalContext.getContext().getStopWatch().tick(); Object responseObject = ((RpcResponseCommand) response).getResponseObject(); if (responseObject instanceof SofaResponse) { SofaResponse sofaResponse = (SofaResponse) responseObject; if (sofaResponse.isError() || sofaResponse.getAppResponse() instanceof Throwable) { sofaResponse.addResponseProp(RemotingConstants.HEAD_RESPONSE_ERROR, StringUtils.TRUE); } response.setHeader(mapSerializer.encode(sofaResponse.getResponseProps())); } return true; } return false; }
if (msg.status() == HttpResponseStatus.OK) { final SofaResponse response = new SofaResponse(); String isError = headers.get(RemotingConstants.HEAD_RESPONSE_ERROR); if (CommonUtils.isTrue(isError)) { response.setAppResponse(throwable); } else { serializeType = HttpTransportUtils.getSerializeTypeByContentType(contentType); response.setSerializeType(serializeType); content.retain(); response.setData(data);
@Override protected SofaResponse run() throws Exception { RpcInternalContext.setContext(rpcInternalContext); RpcInvokeContext.setContext(rpcInvokeContext); SofaResponse sofaResponse = invoker.invoke(request); if (!sofaResponse.isError()) { return sofaResponse; } return getFallback(sofaResponse, null); }
@Override public SofaResponse invoke() { if (isCircuitBreakerOpen() && LOGGER.isWarnEnabled(invoker.getConfig().getAppName())) { LOGGER.warnWithApp(invoker.getConfig().getAppName(), "Circuit Breaker is opened, method: {}#{}", invoker.getConfig().getInterfaceId(), request.getMethodName()); } Future delegate = this.toObservable().toBlocking().toFuture(); RpcInternalContext.getContext().setFuture(new HystrixResponseFuture(delegate, this.responseFuture)); if (this.sofaResponse == null && this.responseFuture == null) { // 没有执行 construct,熔断或是线程池拒绝 return new SofaResponse(); } return this.sofaResponse; } }
/** * 从响应里获取透传数据 * * @param context RpcInvokeContext * @param response 响应 * @param init 传入上下文为空时,是否初始化 */ public static void pickupFromResponse(RpcInvokeContext context, SofaResponse response, boolean init) { if (context == null && !init) { return; } Map<String, String> responseBaggage = response.getResponseProps(); if (CommonUtils.isNotEmpty(responseBaggage)) { String prefix = RemotingConstants.RPC_RESPONSE_BAGGAGE + "."; for (Map.Entry<String, String> entry : responseBaggage.entrySet()) { if (entry.getKey().startsWith(prefix)) { if (context == null) { context = RpcInvokeContext.getContext(); } context.putResponseBaggage(entry.getKey().substring(prefix.length()), entry.getValue()); } } } }
SofaResponse sofaResponse = new SofaResponse(); long startTime = RpcRuntimeContext.now(); try { sofaResponse.setAppResponse(result); } catch (IllegalArgumentException e) { // 非法参数,可能是实现类和接口类不对应) sofaResponse.setErrorMsg(e.getMessage()); } catch (IllegalAccessException e) { // 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的 sofaResponse.setErrorMsg(e.getMessage()); sofaResponse.setAppResponse(e.getCause()); } finally { if (RpcInternalContext.isAttachmentEnable()) {
sofaResponse.setResponseProps(head); sofaResponse.setErrorMsg(errorMessage); } else { sofaResponse.setAppResponse(pbRes);
@Override public SofaResponse decodeObject(AbstractByteBuf data, Map<String, String> context) throws SofaRpcException { try { UnsafeByteArrayInputStream inputStream = new UnsafeByteArrayInputStream(data.array()); Hessian2Input input = new Hessian2Input(inputStream); // 根据SerializeType信息决定序列化器 Object object; boolean genericSerialize = context != null && isGenericResponse( context.get(RemotingConstants.HEAD_GENERIC_TYPE)); if (genericSerialize) { input.setSerializerFactory(genericSerializerFactory); GenericObject genericObject = (GenericObject) input.readObject(); SofaResponse sofaResponse = new SofaResponse(); sofaResponse.setErrorMsg((String) genericObject.getField("errorMsg")); sofaResponse.setAppResponse(genericObject.getField("appResponse")); sofaResponse.setResponseProps((Map<String, String>) genericObject.getField("responseProps")); object = sofaResponse; } else { input.setSerializerFactory(serializerFactory); object = input.readObject(); } input.close(); return (SofaResponse) object; } catch (IOException e) { throw buildDeserializeError(e.getMessage(), e); } }
response.setSerializeType(request.getSerializeType()); if (response.isError()) { ByteBuf content = ctx.alloc().buffer(); content.writeBytes(StringSerializer.encode(response.getErrorMsg())); sendRpcError(status == null ? HttpResponseStatus.INTERNAL_SERVER_ERROR : status, content); } else { if (response.getAppResponse() instanceof Throwable) { ByteBuf content = ctx.alloc().buffer(); String errorMsg = ExceptionUtils.toString((Throwable) response.getAppResponse()); content.writeBytes(StringSerializer.encode(errorMsg)); sendAppError(HttpResponseStatus.OK, content); content.writeBytes(bs.array()); } else { content.writeBytes(StringSerializer.encode(response.getAppResponse().toString()));
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); } } }
@Override public <Response extends ResponseCommand> boolean serializeHeader(Response response) throws SerializationException { if (response instanceof RpcResponseCommand) { RpcInternalContext.getContext().getStopWatch().tick(); Object responseObject = ((RpcResponseCommand) response).getResponseObject(); if (responseObject instanceof SofaResponse) { SofaResponse sofaResponse = (SofaResponse) responseObject; if (sofaResponse.isError() || sofaResponse.getAppResponse() instanceof Throwable) { sofaResponse.addResponseProp(RemotingConstants.HEAD_RESPONSE_ERROR, StringUtils.TRUE); } response.setHeader(mapSerializer.encode(sofaResponse.getResponseProps())); } return true; } return false; }