protected static InvocationException doCreate(StatusType status, Object errorData) { return new InvocationException(status, errorData); }
@Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("InvocationException: code="); sb.append(getStatusCode()); sb.append(";msg="); sb.append(getErrorData()); return sb.toString(); } }
/** * Use routingContext to send failure information in throwable. */ private void sendExceptionByRoutingContext(RoutingContext context, Throwable e) { if (InvocationException.class.isInstance(e)) { InvocationException invocationException = (InvocationException) e; context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(invocationException.getStatusCode()).setStatusMessage(invocationException.getReasonPhrase()) .end(wrapResponseBody(invocationException.getReasonPhrase())); } else { context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(Status.INTERNAL_SERVER_ERROR.getStatusCode()).end(wrapResponseBody(e.getMessage())); } context.response().close(); }
@Override public boolean isRetriableException(Throwable e, boolean sameServer) { boolean retriable = isPresentAsCause(e); if (!retriable) { if (e instanceof InvocationException) { if (((InvocationException) e).getStatusCode() == 503) { return true; } } } return retriable; }
@Override public CompletableFuture<Void> beforeSendResponseAsync(Invocation invocation, HttpServletResponseEx responseEx) { Response response = (Response) responseEx.getAttribute(RestConst.INVOCATION_HANDLER_RESPONSE); ProduceProcessor produceProcessor = (ProduceProcessor) responseEx.getAttribute(RestConst.INVOCATION_HANDLER_PROCESSOR); Object body = response.getResult(); if (response.isFailed()) { body = ((InvocationException) body).getErrorData(); } if (Part.class.isInstance(body)) { return responseEx.sendPart((Part) body); } responseEx.setContentType(produceProcessor.getName() + "; charset=utf-8"); CompletableFuture<Void> future = new CompletableFuture<>(); try (BufferOutputStream output = new BufferOutputStream(Unpooled.compositeBuffer())) { produceProcessor.encodeResponse(output, body); responseEx.setBodyBuffer(output.getBuffer()); future.complete(null); } catch (Throwable e) { future.completeExceptionally(ExceptionFactory.convertProducerException(e)); } return future; } }
protected boolean isFailedResponse(Response resp) { if (resp.isFailed()) { if (InvocationException.class.isInstance(resp.getResult())) { InvocationException e = (InvocationException) resp.getResult(); return e.getStatusCode() == ExceptionFactory.CONSUMER_INNER_STATUS_CODE || e.getStatusCode() == 503; } else { return true; } } else { return false; } }
private void sendResponse(Map<String, String> context, Response response) { invocation.getInvocationStageTrace().finishHandlersResponse(); ResponseHeader header = new ResponseHeader(); header.setStatusCode(response.getStatusCode()); header.setReasonPhrase(response.getReasonPhrase()); header.setContext(context); header.setHeaders(response.getHeaders()); WrapSchema bodySchema = operationProtobuf.findResponseSchema(response.getStatusCode()); Object body = response.getResult(); if (response.isFailed()) { body = ((InvocationException) body).getErrorData(); } try { Buffer respBuffer = HighwayCodec.encodeResponse(msgId, header, bodySchema, body); invocation.getInvocationStageTrace().finishServerFiltersResponse(); connection.write(respBuffer.getByteBuf()); } catch (Exception e) { // 没招了,直接打日志 String msg = String.format("encode response failed, %s, msgId=%d", operationProtobuf.getOperationMeta().getMicroserviceQualifiedName(), msgId); LOGGER.error(msg, e); } finally { if (invocation != null) { invocation.onFinish(response); } } }
protected static InvocationException doCreate(int statusCode, String reasonPhrase, CommonExceptionData data, Throwable e) { return new InvocationException(statusCode, reasonPhrase, data, e); }
protected void onFailure(RoutingContext context) { LOGGER.error("edge server failed.", context.failure()); HttpServerResponse response = context.response(); if (context.failure() instanceof InvocationException) { InvocationException exception = (InvocationException) context.failure(); response.setStatusCode(exception.getStatusCode()); response.setStatusMessage(exception.getErrorData().toString()); response.end(); } else { response.setStatusCode(Status.BAD_GATEWAY.getStatusCode()); response.setStatusMessage(Status.BAD_GATEWAY.getReasonPhrase()); response.end(); } } }
@Override protected boolean isFailedResponse(Response resp) { if (resp.isFailed()) { if (InvocationException.class.isInstance(resp.getResult())) { InvocationException e = (InvocationException) resp.getResult(); return e.getStatusCode() == ExceptionFactory.PRODUCER_INNER_STATUS_CODE; } else { return true; } } else { return false; } } }
@Override public CompletableFuture<Void> beforeSendResponseAsync(Invocation invocation, HttpServletResponseEx responseEx) { Response response = (Response) responseEx.getAttribute(RestConst.INVOCATION_HANDLER_RESPONSE); ProduceProcessor produceProcessor = (ProduceProcessor) responseEx.getAttribute(RestConst.INVOCATION_HANDLER_PROCESSOR); Object body = response.getResult(); if (response.isFailed()) { body = ((InvocationException) body).getErrorData(); } if (Part.class.isInstance(body)) { return responseEx.sendPart((Part) body); } responseEx.setContentType(produceProcessor.getName() + "; charset=utf-8"); CompletableFuture<Void> future = new CompletableFuture<>(); try (BufferOutputStream output = new BufferOutputStream(Unpooled.compositeBuffer())) { produceProcessor.encodeResponse(output, body); responseEx.setBodyBuffer(output.getBuffer()); future.complete(null); } catch (Throwable e) { future.completeExceptionally(ExceptionFactory.convertProducerException(e)); } return future; } }
/** * Use routingContext to send failure information in throwable. */ private void sendExceptionByRoutingContext(RoutingContext context, Throwable e) { if (InvocationException.class.isInstance(e)) { InvocationException invocationException = (InvocationException) e; context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(invocationException.getStatusCode()).setStatusMessage(invocationException.getReasonPhrase()) .end(wrapResponseBody(invocationException.getReasonPhrase())); } else { context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(Status.INTERNAL_SERVER_ERROR.getStatusCode()).end(wrapResponseBody(e.getMessage())); } context.response().close(); }
public void ensureStatusUp() { SCBStatus currentStatus = getStatus(); if (!SCBStatus.UP.equals(currentStatus)) { String message = "The request is rejected. Cannot process the request due to STATUS = " + currentStatus; LOGGER.warn(message); throw new InvocationException(Status.SERVICE_UNAVAILABLE, message); } }
response.setStatusCode(exception.getStatusCode()); response.setStatusMessage(exception.getErrorData().toString()); response.end(); return;
@Override protected boolean isFailedResponse(Response resp) { if (resp.isFailed()) { if (InvocationException.class.isInstance(resp.getResult())) { InvocationException e = (InvocationException) resp.getResult(); return e.getStatusCode() == ExceptionFactory.CONSUMER_INNER_STATUS_CODE; } else { return true; } } else { return false; } } }
private void sendResponse(Map<String, String> context, Response response) { invocation.getInvocationStageTrace().finishHandlersResponse(); ResponseHeader header = new ResponseHeader(); header.setStatusCode(response.getStatusCode()); header.setReasonPhrase(response.getReasonPhrase()); header.setContext(context); header.setHeaders(response.getHeaders()); WrapSchema bodySchema = operationProtobuf.findResponseSchema(response.getStatusCode()); Object body = response.getResult(); if (response.isFailed()) { body = ((InvocationException) body).getErrorData(); } try { Buffer respBuffer = HighwayCodec.encodeResponse(msgId, header, bodySchema, body); invocation.getInvocationStageTrace().finishServerFiltersResponse(); connection.write(respBuffer.getByteBuf()); } catch (Exception e) { // 没招了,直接打日志 String msg = String.format("encode response failed, %s, msgId=%d", operationProtobuf.getOperationMeta().getMicroserviceQualifiedName(), msgId); LOGGER.error(msg, e); } finally { if (invocation != null) { invocation.onFinish(response); } } }
protected void initProduceProcessor() { produceProcessor = restOperationMeta.ensureFindProduceProcessor(requestEx); if (produceProcessor == null) { String msg = String.format("Accept %s is not supported", requestEx.getHeader(HttpHeaders.ACCEPT)); throw new InvocationException(Status.NOT_ACCEPTABLE, msg); } }
@Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("InvocationException: code="); sb.append(getStatusCode()); sb.append(";msg="); sb.append(getErrorData()); return sb.toString(); } }
@Override public boolean isRetriableException(Throwable e, boolean sameServer) { boolean retriable = isPresentAsCause(e); if (!retriable) { if (e instanceof InvocationException) { if (((InvocationException) e).getStatusCode() == 503) { return true; } } } return retriable; }
@Override public Response convert(SwaggerInvocation swaggerInvocation, ConstraintViolationException e) { return Response.createFail(new InvocationException(Status.BAD_REQUEST, e.getConstraintViolations().toString())); }