Example #1
0
        /// <summary>
        /// 远程调用。
        /// </summary>
        /// <typeparam name="T">返回类型。</typeparam>
        /// <param name="parameters">参数字典。</param>
        /// <param name="serviceId">服务Id。</param>
        /// <returns>调用结果。</returns>
        protected async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId)
        {
            object result  = default(T);
            var    command = await _commandProvider.GetCommand(serviceId);

            RemoteInvokeResultMessage message = null;
            var         decodeJOject          = typeof(T) == UtilityType.ObjectType;
            IInvocation invocation            = null;
            var         existsInterceptor     = _interceptors.Any();

            if ((_cacheInterceptor == null || !command.RequestCacheEnabled) && !existsInterceptor)
            {
                message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject);

                if (message == null || !message.IsSucceedRemoteInvokeCalled())
                {
                    return(await FallBackRetryInvoke <T>(parameters, serviceId, command));
                }
            }
            if (_cacheInterceptor != null && command.RequestCacheEnabled)
            {
                invocation = GetCacheInvocation(parameters, serviceId, typeof(T));
                if (invocation != null)
                {
                    var interceptReuslt = await Intercept(_cacheInterceptor, invocation);

                    message = interceptReuslt.Item1;
                    result  = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2;
                }
                else
                {
                    message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject);

                    if (message == null || !message.IsSucceedRemoteInvokeCalled())
                    {
                        return(await FallBackRetryInvoke <T>(parameters, serviceId, command));
                    }
                }
            }
            if (existsInterceptor)
            {
                invocation = invocation == null?GetInvocation(parameters, serviceId, typeof(T)) : invocation;

                foreach (var interceptor in _interceptors)
                {
                    var interceptReuslt = await Intercept(interceptor, invocation);

                    message = interceptReuslt.Item1;
                    result  = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2;
                }
            }
            if (message != null)
            {
                result = await GetInvokeResult <T>(message);
            }
            return((T)result);
        }
Example #2
0
        /// <summary>
        /// 远程调用。
        /// </summary>
        /// <param name="parameters">参数字典。</param>
        /// <param name="serviceId">服务Id。</param>
        /// <returns>调用任务。</returns>
        protected async Task Invoke(IDictionary <string, object> parameters, string serviceId)
        {
            var existsInterceptor             = _interceptors.Any();
            RemoteInvokeResultMessage message = null;

            if (!existsInterceptor)
            {
                message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, false);
            }
            else
            {
                var invocation = GetInvocation(parameters, serviceId, typeof(Task));
                foreach (var interceptor in _interceptors)
                {
                    var interceptReuslt = await Intercept(interceptor, invocation);

                    message = interceptReuslt.Item1;
                }
            }
            if (message == null || !message.IsSucceedRemoteInvokeCalled())
            {
                var command = await _commandProvider.GetCommand(serviceId);
                await FallBackRetryInvoke(parameters, serviceId, command);
            }
        }
        public async Task <object> Invoke(IDictionary <string, object> parameters, Type returnType, string serviceId, string _serviceKey, bool decodeJOject)
        {
            var    time   = 0;
            object result = null;
            RemoteInvokeResultMessage message = null;
            var command = await _commandProvider.GetCommand(serviceId);

            do
            {
                message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject, true);

                if (message != null)
                {
                    if (message.StatusCode == StatusCode.Success)
                    {
                        if (message.Result != null)
                        {
                            result = _typeConvertibleService.Convert(message.Result, returnType);
                        }
                        else
                        {
                            result = message.Result;
                        }
                    }
                    else if (message.IsFailedRemoteInvokeCalled())
                    {
                        continue;
                    }
                    else if (message.IsSucceedRemoteInvokeCalled())
                    {
                        throw message.GetExceptionByStatusCode();
                    }
                }
            } while ((message == null || !message.IsSucceedRemoteInvokeCalled()) && ++time < command.FailoverCluster);

            if (message == null)
            {
                throw new CPlatformException($"{serviceId}远程服务调用失败,暂不存在可用的服务实例");
            }
            if (message.StatusCode != StatusCode.Success)
            {
                throw message.GetExceptionByStatusCode();
            }
            return(result);
        }