Beispiel #1
0
        private void ProcessEvent(BasicDeliverEventArgs ea)
        {
            _qps.Add("r");
            var header     = new HeadersAnalysis(ea.Body);
            var clienttime = header.ClientDate;
            var span       = Math.Abs((DateTime.Now - clienttime).TotalMilliseconds);

            if (Configs.Delay != 0 && span > Configs.Delay * 1000)
            {
                ReplayTo(header.Url, DateTime.Now, ea, 402, $"请求已超时 请求 {ea.RoutingKey} 耗时 {span.ToString()}ms", ContentType.Text);
                return;
            }
            var action = _routing.Route(header.Url.AbsolutePath);

            if (action == null)
            {
                ReplayTo(header.Url, DateTime.Now, ea, 401, "未找到匹配请求的控制器或方法", ContentType.Text);
                return;
            }
            var reques = new Request()
            {
                Headers       = header.Headers,
                Action        = action,
                Url           = header.Url,
                Seralize      = RPCWrite.CreateSeralize(header.ContentType, header.Encode),
                ContentLength = header.ContentLength,
                Body          = header.GetBodys()
            };

            Excute(reques, ea);
        }
Beispiel #2
0
        public async Task <ResponseBase <TOut> > CallAsync <Tin, TOut>(string uri, Tin data, ContentType type)
        {
            var datas    = new byte[2000];
            var write    = new RPCWrite(datas, Encode);
            var encoding = "encoding:" + Encode.WebName;

            write.WriteString(encoding);
            var url = "url:" + "rpc://" + ServerId + uri;

            write.WriteString(url);
            var now = "clientTime:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");

            write.WriteString(now);
            var contenttype = "content-type:" + GetContentTypeName(type);

            write.WriteString(contenttype);
            write.WriteContent(type, data, typeof(Tin));
            var t1 = mqRpc.Request(ServerId, write.GetDatas(), out _);
            var t2 = Task.Delay(TimeOut * 1000);
            await Task.WhenAny(new Task[] { t1, t2 });

            if (!t1.IsCompletedSuccessfully)
            {
                return new ResponseBase <TOut>()
                       {
                           ServerState = -1, ServerMsg = "请求超时"
                       }
            }
            ;
            var rsp      = t1.Result;
            var analysis = new HeadersAnalysis(rsp);
            var seralize = CreateSeralize(analysis.ContentType, analysis.Encode);
            var res      = seralize.DeserializeObject(analysis.GetBodys(), typeof(TOut));
            var state    = int.Parse(analysis.Headers["state"]);
            var msg      = analysis.Headers["msg"];

            if (state == 200)
            {
                return new ResponseBase <TOut> {
                           ServerState = state, ServerMsg = msg, Data = (TOut)res
                }
            }
            ;
            return(new ResponseBase <TOut> {
                ServerState = state, ServerMsg = msg, Data = default
            });