/// <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); } }
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); }
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); }
/// <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); } }