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);
        }
        /// <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 ISellerExpoResponse(RpcTransportMessageResponse response)
            : this()
        {
            if (response == null)
            {
                throw new ExpoMessageException("rpc transport message null exception!");
            }

            if (response.ResponseCode == RpcTransportResponseCode.Success)
            {
                this.fillContent(response.MessageContent);
            }
            else
            {
                //错误信息
                this.errCode = 1;
                this.errMsg  = response.ErrorInfo;
            }
        }
            public ExpoMessageOutput(RpcTransportMessageResponse response)
            {
                if (response == null)
                {
                    throw new ExpoMessageException("rpc transport message null exception!");
                }

                if (string.IsNullOrWhiteSpace(response.MessageId))
                {
                    throw new ExpoMessageException("rpc transport message MessageId null exception!");
                }
                if (response.ServiceUniqueName == null)
                {
                    throw new ExpoMessageException("rpc transport message ServiceUniqueName null exception!");
                }
                //if (response.MessageContent == null)
                //    throw new ExpoMessageException("rpc transport message MessageContent null exception!");

                this.ResponseMessageId = response.MessageId;
                this.ResponseContent   = new Comm.HugeString(response.MessageContent);
                this.ResponseCode      = (int)response.ResponseCode;
                this.ErrorInfo         = response.ErrorInfo;
            }
        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);
        }
Ejemplo n.º 7
0
        public void DoCommandStub(CommandHeader header, object[] inputArgs, out object[] outputArgs)
        {
            var commandId = header.CommandId;
            var appClass  = header.AppClass;

            if (commandId == (uint)ExpoCommandName.ServiceBusCommand)
            {
                //获取请求输入
                var expoInput = new ExpoCommandMessageParser.ExpoMessageInput(inputArgs);
                try
                {
                    //处理请求命令
                    var commandProcessor = this.iocResolver.Resolve <RemoteServiceCommandProcessor>();
                    var rpcRequest       = expoInput.BuidRpcTransportMessage();
                    //构建请求环境
                    this.fillRequestRemoteContext(header, rpcRequest.MessageHeader);

                    //处理并返回
                    var rpcResponse = commandProcessor.ProcessCommand(rpcRequest);

                    //返回命令响应
                    outputArgs = (new ExpoCommandMessageParser.ExpoMessageOutput(rpcResponse)).BuidExpoMessageBody();
                }
                catch (Exception ex)
                {
                    //返回异常响应
                    var serviceUniqueName = new ServiceUniqueNameInfo(expoInput.ServiceAssemblyName, expoInput.ServiceCommandName, ServiceUniqueNameInfo.ServiceMessageType.ServiceCommand);
                    var errorResp         = RpcTransportMessageResponse.BuildErrorResponse(serviceUniqueName, RpcTransportResponseCode.SystemError, ex);
                    outputArgs = (new ExpoCommandMessageParser.ExpoMessageOutput(errorResp)).BuidExpoMessageBody();

                    this.Logger.Error(serviceUniqueName.ToString(), ex);
                }
            }
            else if (commandId == (uint)ExpoCommandName.ServiceBusBroadcastCommand)
            {
                //获取请求输入
                var expoInput = new ExpoCommandMessageParser.ExpoMessageInput(inputArgs);
                try
                {
                    //处理请求命令
                    var commandProcessor = this.iocResolver.Resolve <RemoteServiceCommandProcessor>();
                    var rpcRequest       = expoInput.BuidRpcTransportMessage();
                    //构建请求环境
                    this.fillRequestRemoteContext(header, rpcRequest.MessageHeader);

                    //处理并返回
                    var rpcResponse = commandProcessor.ProcessBroadcastCommand(rpcRequest);

                    //返回命令响应
                    outputArgs = (new ExpoCommandMessageParser.ExpoMessageOutput(rpcResponse)).BuidExpoMessageBody();
                }
                catch (Exception ex)
                {
                    //返回异常响应
                    var serviceUniqueName = new ServiceUniqueNameInfo(expoInput.ServiceAssemblyName, expoInput.ServiceCommandName, ServiceUniqueNameInfo.ServiceMessageType.ServiceCommand);
                    var errorResp         = RpcTransportMessageResponse.BuildErrorResponse(serviceUniqueName, RpcTransportResponseCode.SystemError, ex);
                    outputArgs = (new ExpoCommandMessageParser.ExpoMessageOutput(errorResp)).BuidExpoMessageBody();

                    this.Logger.Error(serviceUniqueName.ToString(), ex);
                }
            }
            else if (commandId == (uint)ExpoCommandName.ISellerLegacyCommand)
            {
                var commandProcessor = this.iocResolver.Resolve <ISellerCommandProcessor>();

                string              jsonRequest = Encoding.Default.GetString(inputArgs[0] as byte[]);
                ISellerExpoRequest  request     = ISellerExpoRequest.ConvertFromJson(jsonRequest);
                ISellerExpoResponse response    = commandProcessor.ProcessCommand(request, messageHeader =>
                {
                    //构建请求环境
                    this.fillRequestRemoteContext(header, messageHeader);
                });
                outputArgs = new object[] { Encoding.Default.GetBytes(response.ConvertToJson()) };
            }
            else
            {
                throw new WindServiceBusException(string.Format("EXPO命令:[{0}]无法识别!", commandId));
            }
        }