Exemplo n.º 1
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            TaskCompletionSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                if (!string.IsNullOrEmpty(content.ExceptionMessage))
                {
                    task.TrySetException(new Exception(content.ExceptionMessage));
                }
                else
                {
                    task.SetResult(message);
                }
            }
            if (message.IsInvokeMessage())
            {
                throw new Exception("message type error");
            }
        }
Exemplo n.º 2
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务消费者接收到消息。");
            }

            ManualResetValueTaskSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                if (!string.IsNullOrEmpty(content.ExceptionMessage))
                {
                    task.SetException(new CPlatformCommunicationException(content.ExceptionMessage, content.StatusCode));
                    WirteDiagnosticError(message);
                }
                else
                {
                    task.SetResult(message);
                    WirteDiagnosticAfter(message);
                }
            }
            if (_serviceExecutor != null && message.IsInvokeMessage())
            {
                await _serviceExecutor.ExecuteAsync(sender, message);
            }
        }
Exemplo n.º 3
0
        private void MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Information))
            {
                _logger.Information("接收到消息。");
            }

            TaskCompletionSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = _objecSerializer.Deserialize <object, RemoteInvokeResultMessage>(message.Content);
                if (!string.IsNullOrEmpty(content.ExceptionMessage))
                {
                    task.TrySetException(new RpcRemoteException(content.ExceptionMessage));
                }
                else
                {
                    task.SetResult(message);
                }
            }
            if (message.IsInvokeMessage())
            {
                _serviceExecutor?.ExecuteAsync(sender, message);
            }
        }
Exemplo n.º 4
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务消费者接收到消息。");
            }

            TaskCompletionSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                //if (!string.IsNullOrEmpty(content.ExceptionMessage))
                //{
                //    task.TrySetException(new CPlatformCommunicationException(content.ExceptionMessage));
                //}
                switch (content.StatusCode)
                {
                case StatusCode.OK:
                    task.SetResult(message);
                    break;

                case StatusCode.CPlatformError:
                    task.TrySetException(new CPlatformException(content.ExceptionMessage));
                    break;

                case StatusCode.BusinessError:
                    task.TrySetException(new BusinessException(content.ExceptionMessage));
                    break;

                case StatusCode.CommunicationError:
                    task.TrySetException(new CPlatformCommunicationException(content.ExceptionMessage));
                    break;

                case StatusCode.DataAccessError:
                    task.TrySetException(new DataAccessException(content.ExceptionMessage));
                    break;

                case StatusCode.ValidateError:
                    task.TrySetException(new ValidateException(content.ExceptionMessage));
                    break;
                //case StatusCode.UnKnownError:
                //    task.TrySetException(new CPlatformException(content.ExceptionMessage));
                //    break;

                default:
                    task.TrySetException(new Exception(content.ExceptionMessage));
                    break;
                }
            }
            if (_serviceExecutor != null && message.IsInvokeMessage())
            {
                await _serviceExecutor.ExecuteAsync(sender, message);
            }
        }
Exemplo n.º 5
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug("接收到消息。");
            }

            TaskCompletionSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                if (!string.IsNullOrEmpty(content.ExceptionMessage))
                {
                    task.TrySetException(new RpcRemoteException(content.ExceptionMessage));
                }
                else
                {
                    task.SetResult(message);
                }
            }
            if (_serviceExecutor != null && message.IsInvokeMessage())
            {
                await _serviceExecutor.ExecuteAsync(sender, message);
            }
        }
        /// <summary>
        /// 执行消息转换后的服务
        /// </summary>
        /// <param name="sender">消息发送者</param>
        /// <param name="message">调用消息</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (!message.IsInvokeMessage())
            {
                return;
            }

            RemoteInvokeMessage remoteInvokeMessage;

            try
            {
                remoteInvokeMessage = message.GetContent <RemoteInvokeMessage>();
            }
            catch (Exception exception)
            {
                _logger.LogError("将接收到的消息反序列化成 TransportMessage<RemoteInvokeMessage> 时发送了错误。", exception);
                return;
            }

            // 定位远程调用的消息服务实体
            var entry = _serviceEntryLocate.Locate(remoteInvokeMessage);

            if (entry == null)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.LogError($"根据服务Id:{remoteInvokeMessage.ServiceId},找不到服务条目");
                }
                return;
            }

            _logger.LogInformation("准备执行本地逻辑");
            var resultMessage = new RemoteInvokeResultMessage();

            // 是否需要等待执行
            if (entry.Descriptor.WaitExecution())
            {
                //执行本地代码
                await LocalExecuteAsync(entry, remoteInvokeMessage, resultMessage);

                //向客户端发送调用结果
                await SendRemoteInvokeResult(sender, message.Id, resultMessage);
            }
            else
            {
                //通知客户端已接收到消息
                await SendRemoteInvokeResult(sender, message.Id, resultMessage);

                //确保新起一个线程执行,不堵塞当前线程
                await Task.Factory.StartNew(async() =>
                {
                    //执行本地代码
                    await LocalExecuteAsync(entry, remoteInvokeMessage, resultMessage);
                },
                                            TaskCreationOptions.LongRunning);
            }
        }
Exemplo n.º 7
0
        public async Task <RemoteInvokeResultMessage> InvokerAsync(TransportMessage message)
        {
            if (!message.IsInvokeMessage())
            {
                return(null);
            }

            RemoteInvokeMessage remoteInvokeContext;

            try
            {
                remoteInvokeContext = message.GetContent <RemoteInvokeMessage>();
            }
            catch (Exception exception)
            {
                _logger.LogError("将接收到的消息反序列化成 TransportMessage<RemoteInvokeMessage> 时发送了错误。", exception);
                return(null);
            }
            var resultMessage = new RemoteInvokeResultMessage();

            try
            {
                var entry  = _entryLocator.Locate(remoteInvokeContext.ServiceId);
                var result = await entry.Func(remoteInvokeContext.Parameters);

                var task = result as Task;

                if (task == null)
                {
                    resultMessage.Result = result;
                }
                else
                {
                    task.Wait();

                    var taskType = task.GetType().GetTypeInfo();
                    if (taskType.IsGenericType)
                    {
                        resultMessage.Result = taskType.GetProperty("Result").GetValue(task);
                    }
                }
            }
            catch (Exception e)
            {
                _logger.LogError("执行本地服务调用发生错误", e);
                resultMessage.ExceptionMessage = GetExceptionMessage(e);
            }
            return(resultMessage);
        }
Exemplo n.º 8
0
        public ProtoBufTransportMessage(TransportMessage transportMessage)
        {
            Id          = transportMessage.Id;
            ContentType = transportMessage.ContentType;
            if (transportMessage.IsInvokeMessage())
            {
                Content = SerializerUtilitys.Serialize(
                    new ProtoBufRemoteInvokeMessage(transportMessage.GetContent <RemoteInvokeMessage>()));
            }

            if (transportMessage.IsResultMessage())
            {
                Content = SerializerUtilitys.Serialize(
                    new ProtoBufRemoteResultMessage(transportMessage.GetContent <RemoteResultMessage>()));
            }
        }
Exemplo n.º 9
0
        public ProtoBufferTransportMessage(TransportMessage transportMessage)
        {
            Id          = transportMessage.Id;
            ContentType = transportMessage.ContentType;

            object contentObject;

            if (transportMessage.IsInvokeMessage())
            {
                contentObject = new ProtoBufferRemoteInvokeMessage(transportMessage.GetContent <RemoteInvokeMessage>());
            }
            else if (transportMessage.IsInvokeResultMessage())
            {
                contentObject = new ProtoBufferRemoteInvokeResultMessage(transportMessage.GetContent <RemoteInvokeResultMessage>());
            }
            else
            {
                throw new NotSupportedException($"无法支持的消息类型:{ContentType}!");
            }

            Content = SerializerUtilitys.Serialize(contentObject);
        }
Exemplo n.º 10
0
        /// <summary>
        /// 执行。
        /// </summary>
        /// <param name="sender">消息发送者。</param>
        /// <param name="message">调用消息。</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Information))
            {
                _logger.LogInformation("接收到消息。");
            }

            if (!message.IsInvokeMessage())
            {
                return;
            }

            RemoteInvokeMessage remoteInvokeMessage;

            try
            {
                remoteInvokeMessage = message.GetContent <RemoteInvokeMessage>();
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "将接收到的消息反序列化成 TransportMessage<RemoteInvokeMessage> 时发送了错误。");
                return;
            }

            var entry = _serviceEntryLocate.Locate(remoteInvokeMessage);

            if (entry == null)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.LogError($"根据服务Id:{remoteInvokeMessage.ServiceId},找不到服务条目。");
                }
                return;
            }

            if (remoteInvokeMessage.Attachments != null)
            {
                foreach (var attachment in remoteInvokeMessage.Attachments)
                {
                    RpcContext.GetContext().SetAttachment(attachment.Key, attachment.Value);
                }
            }


            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug("准备执行本地逻辑。");
            }

            var resultMessage = new RemoteInvokeResultMessage();

            //是否需要等待执行。
            if (entry.Descriptor.WaitExecution())
            {
                //执行本地代码。
                await  LocalExecuteAsync(entry, remoteInvokeMessage, resultMessage);

                //向客户端发送调用结果。
                await SendRemoteInvokeResult(sender, message.Id, resultMessage);
            }
            else
            {
                //通知客户端已接收到消息。
                await SendRemoteInvokeResult(sender, message.Id, resultMessage);

                //确保新起一个线程执行,不堵塞当前线程。
                await Task.Factory.StartNew(async() =>
                {
                    //执行本地代码。
                    await LocalExecuteAsync(entry, remoteInvokeMessage, resultMessage);
                }, TaskCreationOptions.LongRunning);
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// 执行。
        /// </summary>
        /// <param name="sender">消息发送者。</param>
        /// <param name="message">调用消息。</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Information))
            {
                _logger.Information("接收到消息。");
            }

            if (!message.IsInvokeMessage())
            {
                return;
            }

            RemoteInvokeMessage remoteInvokeMessage;

            try
            {
                remoteInvokeMessage = _objecSerializer.Deserialize <object, RemoteInvokeMessage>(message.Content);
            }
            catch (Exception exception)
            {
                _logger.Error($"将接收到的消息反序列化成 TransportMessage<RemoteInvokeMessage> 时发送了错误。", exception);
                return;
            }

            var entry = _serviceEntryLocate.Locate(remoteInvokeMessage);

            if (entry == null)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.Error($"根据服务Id:{remoteInvokeMessage.ServiceId},找不到服务条目。");
                }
                return;
            }

            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.Debug("准备执行本地逻辑。");
            }

            var resultMessage = new RemoteInvokeResultMessage();

            try
            {
                var result = entry.Func(remoteInvokeMessage.Parameters);
                var task   = result as Task;

                if (task == null)
                {
                    resultMessage.Result = result;
                }
                else
                {
                    task.Wait();

                    var taskType = task.GetType();
                    if (taskType.IsGenericType)
                    {
                        resultMessage.Result = taskType.GetProperty("Result").GetValue(task);
                    }
                }
            }
            catch (Exception exception)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.Error("执行本地逻辑时候发生了错误。", exception);
                }
                resultMessage.ExceptionMessage = GetExceptionMessage(exception);
            }

            try
            {
                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.Debug("准备发送响应消息。");
                }

                await sender.SendAsync(TransportMessage.CreateInvokeResultMessage(message.Id, resultMessage));

                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.Debug("响应消息发送成功。");
                }
            }
            catch (Exception exception)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.Error("发送响应消息时候发生了异常。", exception);
                }
            }
        }
Exemplo n.º 12
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务消费者接收到消息。");
            }

            ManualResetValueTaskSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                if (!string.IsNullOrEmpty(content.ExceptionMessage))
                {
                    // task.SetException(new CPlatformCommunicationException(content.ExceptionMessage,content.StatusCode));
                    switch (content.StatusCode)
                    {
                    case StatusCode.Success:
                        task.SetResult(message);
                        break;

                    case StatusCode.CPlatformError:
                        task.SetException(new CPlatformException(content.ExceptionMessage, StatusCode.CPlatformError));
                        break;

                    case StatusCode.BusinessError:
                        task.SetException(new BusinessException(content.ExceptionMessage));
                        break;

                    case StatusCode.CommunicationError:
                        task.SetException(new CPlatformCommunicationException(content.ExceptionMessage));
                        break;

                    case StatusCode.DataAccessError:
                        task.SetException(new DataAccessException(content.ExceptionMessage));
                        break;

                    case StatusCode.ValidateError:
                        task.SetException(new ValidateException(content.ExceptionMessage));
                        break;

                    case StatusCode.UserFriendly:
                        task.SetException(new UserFriendlyException(content.ExceptionMessage));
                        break;

                    case StatusCode.UnAuthorized:
                        task.SetException(new UnAuthorizedException(content.ExceptionMessage));
                        break;

                    case StatusCode.UnAuthentication:
                        task.SetException(new UnAuthenticationException(content.ExceptionMessage));
                        break;

                    default:
                        task.SetException(new Exception(content.ExceptionMessage));
                        break;
                    }
                    WirteDiagnosticError(message);
                }
                else
                {
                    task.SetResult(message);
                    WirteDiagnosticAfter(message);
                }
            }
            if (_serviceExecutor != null && message.IsInvokeMessage())
            {
                await _serviceExecutor.ExecuteAsync(sender, message);
            }
        }