public ExpoMessageInput(RpcTransportMessageRequest request) { if (request == null) { throw new ExpoMessageException("rpc transport message null exception!"); } if (string.IsNullOrWhiteSpace(request.MessageId)) { throw new ExpoMessageException("rpc transport message RequestMessageId null exception!"); } if (request.ServiceUniqueName == null) { throw new ExpoMessageException("rpc transport message CommandUniqueName null exception!"); } if (request.MessageContent == null) { throw new ExpoMessageException("rpc transport message MessageContent null exception!"); } this.RequestMessageId = request.MessageId; this.ServiceAssemblyName = request.ServiceUniqueName.ServiceAssemblyName; this.ServiceCommandName = request.ServiceUniqueName.ServiceMessageName; this.RequestMessageContent = request.MessageContent; }
/// <summary> /// 广播命令 /// </summary> internal ICollection <ServiceResponseMessageWithResponseContext> BroadcastCommand(ServiceUniqueNameInfo commandUniqueName, string requestMessageContent) { //1. 服务发现(找到所有可以请求的目标) var remoteContextList = this.rpcServerManager.DiscoverRemoteService(commandUniqueName); if (remoteContextList == null || remoteContextList.Count < 1) { return(new ServiceResponseMessageWithResponseContext[0]); //throw new WindServiceBusRemoteServiceNotFoundException(commandUniqueName.FullServiceUniqueName); } //2. 广播请求 RpcTransportMessageRequest requestMessage = new RpcTransportMessageRequest(MessageIdGenerator.CreateMessageId()) { ServiceUniqueName = commandUniqueName, MessageHeader = new RpcTransportMessageHeader { //TODO: 其他消息头 }, MessageContent = requestMessageContent, }; ICollection <RpcTransportErrorResponse> errorCollection; var responseCollection = this.rpcServerManager.BroadcastMessage(requestMessage, remoteContextList, out errorCollection); var resultList = responseCollection.Select(resp => new ServiceResponseMessageWithResponseContext(resp.MessageContent, new RemoteServiceBusResponseContext(resp.MessageHeader))).ToList(); if (errorCollection != null && errorCollection.Count > 0) { //TODO: 异常列表返回处理 } return(resultList); }
public RpcTransportMessageResponse SendMessage(RpcTransportMessageRequest request, IRpcMessageSenderContext requestContext) { this.validateMessage(request); var context = this.validateExpoSenderContext(requestContext); return(this.sendMessageCore(request, context)); }
private void validateMessage(RpcTransportMessageRequest request) { //验证消息 if (string.IsNullOrWhiteSpace(request.MessageId)) { throw new WindServiceBusException("request message id empty error!"); } }
private bool dispatchCommand( ServiceUniqueNameInfo commandUniqueName, IRpcMessageSenderContext context, string requestMessageContent, out RemoteServiceBusResponseContext responseContext, out string responseMessageContent, out WindServiceBusRpcException rpcException) { // 创建响应上下文 responseMessageContent = null; rpcException = null; responseContext = new RemoteServiceBusResponseContext(); context.FillRemoteContext(responseContext); // 通过RPC框架执行远程调用 try { RpcTransportMessageRequest requestMessage = new RpcTransportMessageRequest(MessageIdGenerator.CreateMessageId()) { ServiceUniqueName = commandUniqueName, MessageHeader = new RpcTransportMessageHeader { //TODO: 其他消息头 }, MessageContent = requestMessageContent, }; RpcTransportMessageResponse responseMessage = this.rpcServerManager.SendMessage(requestMessage, context); //响应上下文 if (responseMessage != null) { responseContext.FillRemoteContext(responseMessage.MessageHeader); //服务响应信息填入RemoteContext } //响应消息验证 if (responseMessage == null || responseMessage.CorrelationMessageId == null || responseMessage.CorrelationMessageId != requestMessage.MessageId || responseMessage.MessageContent == null) { throw new WindServiceBusException(string.Format("request [{0}] get error response !", requestMessage.MessageId)); } if (responseMessage.ResponseCode != RpcTransportResponseCode.Success) { throw new WindServiceBusException(string.Format("request [{0}] get error response: {1}", requestMessage.MessageId, responseMessage.ErrorInfo)); } responseMessageContent = responseMessage.MessageContent; return(true); //请求成功 } catch (Exception serviceBusException) { this._logger.Error("WindServiceBusException: " + commandUniqueName, serviceBusException); rpcException = new WindServiceBusRpcException(responseContext, serviceBusException); return(false); //请求失败 } }
/// <summary> /// 响应远程请求 /// </summary> public RpcTransportMessageResponse ProcessCommand(RpcTransportMessageRequest rpcRequest /*TODO: 请求上下文信息*/) { //本地服务发现 ServiceCommandTypeInfo localCommandInfo = null; bool isLocalCommand = this.serviceBusRegistry.IsLocalServiceCommand(rpcRequest.ServiceUniqueName, out localCommandInfo); string responseMessageContent = null; if (isLocalCommand) { using (performanceCounter.BeginStopwatch(string.Format("localInvoke: {0}", rpcRequest.ServiceUniqueName.FullServiceUniqueName))) { //本地服务 IServiceCommandResult commandResult = null; var commandData = (IServiceCommand)this.serializer.DeserializeString(localCommandInfo.CommandType, rpcRequest.MessageContent); bool triggeredLocal = serviceBus.triggerLocalCommand(localCommandInfo.CommandType, localCommandInfo.CommandResultType, commandData, out commandResult); if (!triggeredLocal) { throw new WindServiceBusLocalServiceNotFoundException(rpcRequest.ServiceUniqueName.FullServiceUniqueName); } // 去除null判断,允许数据内容为null //if (commandResult == null) //{ // throw new WindServiceBusException(string.Format("service command [{0}] process error!", rpcRequest.ServiceUniqueName.FullServiceUniqueName)); //} responseMessageContent = this.serializer.SerializeString(commandResult); } } else { using (performanceCounter.BeginStopwatch(string.Format("remoteInvoke: {0}", rpcRequest.ServiceUniqueName.FullServiceUniqueName))) { //远程服务 var resultWithContext = serviceBus.triggerRemoteCommand(rpcRequest.ServiceUniqueName, rpcRequest.MessageContent); responseMessageContent = resultWithContext.ResponseMessageContent; } } //构建响应输出 var messageHeader = new RpcTransportMessageHeader(); var rpcResponse = new RpcTransportMessageResponse(MessageIdGenerator.CreateMessageId()) { MessageHeader = messageHeader, CorrelationMessageId = rpcRequest.MessageId, ServiceUniqueName = rpcRequest.ServiceUniqueName, MessageContent = responseMessageContent }; return(rpcResponse); }
private RpcTransportMessageResponse sendMessageCore(RpcTransportMessageRequest request, ExpoMessageSenderContext context) { /* * var proxy = RealProxy.InitInstanceByConnection(this.appServer); * CommandHeader header = new CommandHeader((ushort)context.TargetAppClassId, (uint)context.TargetCommandId); * var reqObj = (new ExpoCommandMessageParser.ExpoMessageInput(request)).BuidExpoMessageBody(); * object[] resObj = null; * proxy.DoCommandProxy(header, reqObj, out resObj); * var resultRpcMessage = (new ExpoCommandMessageParser.ExpoMessageOutput(resObj)).BuidRpcTransportMessage(request); * return resultRpcMessage; */ //构建消息体 var requestMsg = new Message(); requestMsg.SetCommand((ushort)context.TargetAppClassId, (uint)context.TargetCommandId); requestMsg.FillBody((new ExpoCommandMessageParser.ExpoMessageInput(request)).BuidExpoMessageBody(), true); //调用RPC var expoSyncMessage = new WindMessageBus.SyncUserMessage(requestMsg); int resultVal = this.appServer.sendMessage(expoSyncMessage, context.CommandTimeout); //处理(抛出)异常 if (expoSyncMessage.ErrInfo != null) { throw new WindServiceBusException(expoSyncMessage.ErrInfo); } var responseMsg = expoSyncMessage.Response; if (responseMsg.Header.CommandClass != context.TargetAppClassId || responseMsg.Header.CommandValue != context.TargetCommandId) { throw new WindServiceBusException("expo response not match request!"); } if (responseMsg.isErrMsg()) { string errorInfo = "unknow expo response exception"; responseMsg.GetErrInfo(out errorInfo); throw new WindServiceBusException(errorInfo); } //构建消息返回 var expoResponse = responseMsg.ToAnswerObj(); var resultRpcMessage = (new ExpoCommandMessageParser.ExpoMessageOutput(expoResponse)).BuidRpcTransportMessage(request); //resultRpcMessage.MessageHeader... //TODO: 其他响应消息头 return(resultRpcMessage); }
/// <summary> /// 创建RPC响应消息 /// </summary> /// <param name="requestMessageId">请求消息ID</param> public RpcTransportMessageResponse BuidRpcTransportMessage(RpcTransportMessageRequest requestMessage) { if (requestMessage == null) { throw new ArgumentNullException("requestMessage"); } return(new RpcTransportMessageResponse(this.ResponseMessageId) { MessageHeader = new RpcTransportMessageHeader(), CorrelationMessageId = requestMessage.MessageId, ServiceUniqueName = requestMessage.ServiceUniqueName, MessageContent = this.ResponseContent.Value, ResponseCode = (RpcTransportResponseCode)this.ResponseCode, ErrorInfo = this.ErrorInfo }); }
/// <summary> /// 响应远程广播请求 /// </summary> /// <param name="rpcRequest"></param> /// <returns></returns> public RpcTransportMessageResponse ProcessBroadcastCommand(RpcTransportMessageRequest rpcRequest) { List <string> resultList = new List <string>(); //1. 本地调用 using (performanceCounter.BeginStopwatch(string.Format("localBroadcastInvoke: {0}", rpcRequest.ServiceUniqueName.FullServiceUniqueName))) { ServiceCommandTypeInfo localCommandInfo = null; bool isLocalCommand = this.serviceBusRegistry.IsLocalServiceCommand(rpcRequest.ServiceUniqueName, out localCommandInfo); if (isLocalCommand) { IServiceCommandResult commandResult = null; var commandData = (IServiceCommand)this.serializer.DeserializeString(localCommandInfo.CommandType, rpcRequest.MessageContent); bool triggeredLocal = serviceBus.triggerLocalCommand(localCommandInfo.CommandType, localCommandInfo.CommandResultType, commandData, out commandResult); if (triggeredLocal) { string responseMessageContent = this.serializer.SerializeString(commandResult); resultList.Add(responseMessageContent); } } } using (performanceCounter.BeginStopwatch(string.Format("remoteBroadcastInvoke: {0}", rpcRequest.ServiceUniqueName.FullServiceUniqueName))) { //2. 远程调用 var resultWithContext = serviceBus.broadcastRemoteCommand(rpcRequest.ServiceUniqueName, rpcRequest.MessageContent); resultList.AddRange(resultWithContext.Select(r => r.ResponseMessageContent)); } //3. 构建响应输出 var contentResult = this.serializer.CombineToArray(resultList); var messageHeader = new RpcTransportMessageHeader(); var rpcResponse = new RpcTransportMessageResponse(MessageIdGenerator.CreateMessageId()) { MessageHeader = messageHeader, CorrelationMessageId = rpcRequest.MessageId, ServiceUniqueName = rpcRequest.ServiceUniqueName, MessageContent = contentResult }; return(rpcResponse); }
public ICollection <RpcTransportMessageResponse> BroadcastMessage( RpcTransportMessageRequest request, IEnumerable <IRpcMessageSenderContext> requestContext, out ICollection <RpcTransportErrorResponse> errorResponse) { this.validateMessage(request); /* * List<RpcTransportMessageResponse> resultResponse = new List<RpcTransportMessageResponse>(); * errorResponse = new List<RpcTransportErrorResponse>(); * foreach (var senderContext in requestContext) * { * ExpoMessageSenderContext context = null; * try * { * context = this.validateExpoSenderContext(senderContext); * RpcTransportMessageResponse response = this.sendMessageCore(request, context); * resultResponse.Add(response); * } * catch (Exception ex) * { * RpcTransportErrorResponse errorMsg = new RpcTransportErrorResponse(request.MessageId, context, ex); * errorResponse.Add(errorMsg); * } * } * return resultResponse; */ //并行版本 var requestContextList = requestContext.ToList(); List <RpcTransportMessageResponse> resultResponse = new List <RpcTransportMessageResponse>(); List <RpcTransportErrorResponse> errorResponseList = new List <RpcTransportErrorResponse>(); using (var countdownEvent = new CountdownEvent(1)) { for (int i = 0; i < requestContextList.Count; i++) { countdownEvent.AddCount(); ThreadPool.QueueUserWorkItem(state => { int idx = (int)state; ExpoMessageSenderContext context = null; try { var senderContext = requestContextList[idx]; context = this.validateExpoSenderContext(senderContext); RpcTransportMessageResponse response = this.sendMessageCore(request, context); resultResponse.Add(response); } catch (Exception ex) { RpcTransportErrorResponse errorMsg = new RpcTransportErrorResponse(request.MessageId, context, ex); errorResponseList.Add(errorMsg); } finally { countdownEvent.Signal(); } }, i); } countdownEvent.Signal(); countdownEvent.Wait(); } errorResponse = errorResponseList; return(resultResponse); }
/// <summary> /// 广播消息 /// </summary> /// <param name="request">请求消息</param> /// <param name="requestContext">请求目标集合</param> /// <returns>响应消息集合</returns> public ICollection <RpcTransportMessageResponse> BroadcastMessage( RpcTransportMessageRequest request, IEnumerable <IRpcMessageSenderContext> requestContext, out ICollection <RpcTransportErrorResponse> errorResponse) { return(this.MessageSender.BroadcastMessage(request, requestContext, out errorResponse)); }
/// <summary> /// 发送RPC请求并获取响应 /// </summary> public RpcTransportMessageResponse SendMessage(RpcTransportMessageRequest request, IRpcMessageSenderContext requestContext) { return(this.MessageSender.SendMessage(request, requestContext)); }