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);
        }
Example #2
0
        private Task <T> GetInvokeResult <T>(RemoteInvokeResultMessage message)
        {
            return(Task.Run(() =>
            {
                object result = default(T);
                if (message.StatusCode == StatusCode.Success)
                {
                    if (message.Result != null)
                    {
                        result = _typeConvertibleService.Convert(message.Result, typeof(T));
                    }
                }
                else
                {
                    throw message.GetExceptionByStatusCode();
                }

                return (T)result;
            }));
        }
Example #3
0
        private Task <object> GetInvokeResult(RemoteInvokeResultMessage message, Type returnType)
        {
            return(Task.Run(() =>
            {
                object result;
                if (message.StatusCode == StatusCode.Success)
                {
                    if (message.Result != null)
                    {
                        result = _typeConvertibleService.Convert(message.Result, returnType);
                    }
                    else
                    {
                        result = message.Result;
                    }
                }
                else
                {
                    throw message.GetExceptionByStatusCode();
                }

                return result;
            }));
        }