public Result invoke()

in dubbo-filter-extensions/dubbo-filter-polaris-dubbo2/dubbo-filter-polaris-circuitbreaker-dubbo2/src/main/java/org/apache/dubbo/filter/dubbo2/CircuitBreakerFilter.java [70:114]


    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        PolarisOperator polarisOperator = getPolarisOperator();
        if (null == polarisOperator) {
            return invoker.invoke(invocation);
        }

        CircuitBreakAPI circuitBreakAPI = getPolarisOperator().getCircuitBreakAPI();
        InvokeContext.RequestContext context = new InvokeContext.RequestContext(createCalleeService(invoker),
            invocation.getMethodName());
        context.setResultToErrorCode(this);
        InvokeHandler handler = circuitBreakAPI.makeInvokeHandler(context);
        try {
            long startTimeMilli = System.currentTimeMillis();
            InvokeContext.ResponseContext responseContext = new InvokeContext.ResponseContext();
            responseContext.setDurationUnit(TimeUnit.MILLISECONDS);
            Result result = null;
            RpcException exception = null;
            handler.acquirePermission();
            try {
                result = invoker.invoke(invocation);
                responseContext.setDuration(System.currentTimeMillis() - startTimeMilli);
                if (result.hasException()) {
                    responseContext.setError(result.getException());
                    handler.onError(responseContext);
                } else {
                    responseContext.setResult(result);
                    handler.onSuccess(responseContext);
                }
            } catch (RpcException e) {
                exception = e;
                responseContext.setError(e);
                responseContext.setDuration(System.currentTimeMillis() - startTimeMilli);
                handler.onError(responseContext);
            }
            ResourceStat resourceStat = createInstanceResourceStat(invoker, invocation, responseContext,
                responseContext.getDuration());
            circuitBreakAPI.report(resourceStat);
            if (result != null) {
                return result;
            }
            throw exception;
        } catch (CallAbortedException abortedException) {
            return callback.handle(invoker, invocation, abortedException);
        }
    }