コード例 #1
0
        public TransportMessage GetTransportMessage()
        {
            var message = new TransportMessage
            {
                ContentType = ContentType,
                Id = Id,
                Content = null
            };

            object contentObject;
            if (IsInvokeMessage())
            {
                contentObject =
                    SerializerUtilitys.Deserialize<ProtoBufferRemoteInvokeMessage>(Content).GetRemoteInvokeMessage();
            }
            else if (IsInvokeResultMessage())
            {
                contentObject =
                    SerializerUtilitys.Deserialize<ProtoBufferRemoteInvokeResultMessage>(Content)
                        .GetRemoteInvokeResultMessage();
            }
            else
            {
                throw new NotSupportedException($"无法支持的消息类型:{ContentType}!");
            }

            message.Content = contentObject;

            return message;
        }
コード例 #2
0
        protected IByteBuffer GetByteBuffer(TransportMessage message)
        {
            var data = _transportMessageEncoder.Encode(message);

            var buffer = Unpooled.Buffer(data.Length, data.Length);
            return buffer.WriteBytes(data);
        }
コード例 #3
0
ファイル: RemoteInvokeService.cs プロジェクト: yaozhenfa/Rpc
        public async Task<TransportMessage> InvokeAsync(RemoteInvokeContext context, CancellationToken cancellationToken)
        {
            if (context == null)
                throw new ArgumentNullException(nameof(context));

            if (context.InvokeMessage == null)
                throw new ArgumentNullException(nameof(context.InvokeMessage));

            if (string.IsNullOrEmpty(context.InvokeMessage.ServiceId))
                throw new ArgumentException("服务Id不能为空。", nameof(context.InvokeMessage.ServiceId));

            var invokeMessage = context.InvokeMessage;
            var address = await _addressResolver.Resolver(invokeMessage.ServiceId);

            if (address == null)
                throw new RpcException($"无法解析服务Id:{invokeMessage.ServiceId}的地址信息。");

            try
            {
                var client = _transportClientFactory.CreateClient(address.CreateEndPoint());
                var message = new TransportMessage<RemoteInvokeMessage>
                {
                    Content = context.InvokeMessage,
                    Id = Guid.NewGuid().ToString("N")
                };
                await client.SendAsync(TransportMessage.Convert(message));
                var resultMessage = await client.ReceiveAsync(message.Id);
                return resultMessage;
            }
            catch (Exception exception)
            {
                _logger.Fatal($"发起请求中发生了错误,服务Id:{invokeMessage.ServiceId}。", exception);
                throw;
            }
        }
コード例 #4
0
        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="message">消息内容。</param>
        /// <returns>一个任务。</returns>
        public async Task SendAsync(TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Information))
                _logger.LogInformation("准备发送消息:" + message.Id);

            var data = GetByteBuffer(message);
            await _session.SendAsync(data, 0, data.Length);
        }
コード例 #5
0
        public byte[] Encode(TransportMessage message)
        {
            var transportMessage = new ProtoBufferTransportMessage(message)
            {
                Id = message.Id,
                ContentType = message.ContentType
            };

            return SerializerUtilitys.Serialize(transportMessage);
        }
コード例 #6
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("将接收到的消息反序列化成 TransportMessage<RemoteInvokeMessage> 时发送了错误。", exception);
                return;
            }

            var entry = _serviceEntryLocate.Locate(remoteInvokeMessage);

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

            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);
            }
        }
コード例 #7
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);
        }
コード例 #8
0
 /// <summary>
 /// 发送消息并清空缓冲区。
 /// </summary>
 /// <param name="message">消息内容。</param>
 /// <returns>一个任务。</returns>
 public Task SendAndFlushAsync(TransportMessage message)
 {
     var buffer = GetByteBuffer(message);
     return _context.WriteAndFlushAsync(buffer);
 }
コード例 #9
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("将接收到的消息反序列化成 TransportMessage<RemoteInvokeMessage> 时发送了错误。", exception);
                return;
            }

            var entry = _serviceEntryLocate.Locate(remoteInvokeMessage);

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

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

            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().GetTypeInfo();
                    if (taskType.IsGenericType)
                        resultMessage.Result = taskType.GetProperty("Result").GetValue(task);
                }
            }
            catch (Exception exception)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                    _logger.LogError("执行本地逻辑时候发生了错误。", exception);
                resultMessage.ExceptionMessage = GetExceptionMessage(exception);
            }

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

                await sender.SendAsync(TransportMessage.CreateInvokeResultMessage(message.Id, resultMessage));
                if (_logger.IsEnabled(LogLevel.Debug))
                    _logger.LogDebug("响应消息发送成功。");
            }
            catch (Exception exception)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                    _logger.LogError("发送响应消息时候发生了异常。", exception);
            }
        }
コード例 #10
0
ファイル: TransportChannel.cs プロジェクト: xiongeee/Rpc
 /// <summary>
 /// 发送消息。
 /// </summary>
 /// <param name="message">消息内容。</param>
 /// <returns>一个任务。</returns>
 public Task SendAsync(TransportMessage message)
 {
     return _messageSender.SendAsync(message);
 }
コード例 #11
0
ファイル: MessageListener.cs プロジェクト: yonglehou/Rpc-1
 /// <summary>
 /// 触发接收到消息事件。
 /// </summary>
 /// <param name="sender">消息发送者。</param>
 /// <param name="message">接收到的消息。</param>
 public void OnReceived(IMessageSender sender, TransportMessage message)
 {
     Received?.Invoke(sender, message);
 }
コード例 #12
0
ファイル: ServiceHostAbstract.cs プロジェクト: cjt908/Rpc
 private void MessageListener_Received(IMessageSender sender, TransportMessage message)
 {
     _serviceExecutor.ExecuteAsync(sender, message);
 }
コード例 #13
0
 /// <summary>
 /// 发送消息并清空缓冲区。
 /// </summary>
 /// <param name="message">消息内容。</param>
 /// <returns>一个任务。</returns>
 public async Task SendAndFlushAsync(TransportMessage message)
 {
     var data = GetByteBuffer(message);
     await _client.SendAsync(data, 0, data.Length);
 }
コード例 #14
0
        protected byte[] GetByteBuffer(TransportMessage message)
        {
            var data = _transportMessageEncoder.Encode(message);

            return data;
        }
コード例 #15
0
 /// <summary>
 /// 发送消息并清空缓冲区。
 /// </summary>
 /// <param name="message">消息内容。</param>
 /// <returns>一个任务。</returns>
 public async Task SendAndFlushAsync(TransportMessage message)
 {
     var buffer = GetByteBuffer(message);
     await (await _channel).WriteAndFlushAsync(buffer);
 }
コード例 #16
0
ファイル: TransportClient.cs プロジェクト: cjt908/Rpc
        private void MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Information))
                _logger.LogInformation("接收到消息。");

            TaskCompletionSource<TransportMessage> task;
            if (!_resultDictionary.TryGetValue(message.Id, out task))
                return;

            if (message.IsInvokeResultMessage())
            {
                var content = (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);
        }
コード例 #17
0
 /// <summary>
 /// 触发接收到消息事件。
 /// </summary>
 /// <param name="sender">消息发送者。</param>
 /// <param name="message">接收到的消息。</param>
 /// <returns>一个任务。</returns>
 public async Task OnReceived(IMessageSender sender, TransportMessage message)
 {
     if (Received == null)
         return;
     await Received(sender, message);
 }
コード例 #18
0
 public byte[] Encode(TransportMessage message)
 {
     var content = JsonConvert.SerializeObject(message);
     return Encoding.UTF8.GetBytes(content);
 }
コード例 #19
0
ファイル: TransportChannel.cs プロジェクト: xiongeee/Rpc
 /// <summary>
 /// 触发接收到消息事件。
 /// </summary>
 /// <param name="sender">消息发送者。</param>
 /// <param name="message">接收到的消息。</param>
 public void OnReceived(IMessageSender sender, TransportMessage message)
 {
     _messageListener.OnReceived(sender, message);
 }