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);
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
 /// <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));
 }
Exemplo n.º 12
0
 /// <summary>
 /// 发送RPC请求并获取响应
 /// </summary>
 public RpcTransportMessageResponse SendMessage(RpcTransportMessageRequest request, IRpcMessageSenderContext requestContext)
 {
     return(this.MessageSender.SendMessage(request, requestContext));
 }