Ejemplo n.º 1
0
        public virtual DataEventArgs GetResult(DataEventArgs e)
        {
            DataEventArgs arg = new DataEventArgs();

            try
            {
                var cts = new CancellationTokenSource(150000);
                while (!cts.Token.IsCancellationRequested)
                {
                    if (ResultTask.TryGetValue(e.TaskId, out arg))
                    {
                        arg.StatusCode = StatusCode.Success;
                        Channels[arg.CallHashCode].ActiveHash = 0;
                        try
                        {
                            StateObject oo = new StateObject();
                            RunStateObjects.TryRemove(arg.TaskId, out oo);
                            oo.Builder.ReSet();
                            DataEventArgs outarg = new DataEventArgs();
                            ResultTask.TryRemove(arg.TaskId, out outarg);
                            RuningTask.TryRemove(arg.TaskId, out outarg);
                        }
                        catch { }
                        return(arg);
                    }
                    Thread.Sleep(3);
                }
            }
            catch (Exception ex)
            {
                arg.StatusCode = StatusCode.Serious;
                _log.Error(ex);
                Console.WriteLine(ex);
                Channels[e.CallHashCode].ActiveHash = 0;
                return(arg);
            }
            _log.Info(e.TaskId + "超时");
            _timeoutTask.Add(e);
            e.StatusCode = StatusCode.TimeOut;
            return(e);
        }
Ejemplo n.º 2
0
        public override void Call(object obj, int len)
        {
            DataEventArgs outDea = new DataEventArgs();
            DataEventArgs ea     = (DataEventArgs)obj;

            try
            {
                if (RuningTask == null)
                {
                    RuningTask = new ConcurrentDictionary <int, DataEventArgs>();
                }
                RuningTask.AddOrUpdate(ea.TaskId, ea, (key, value) => value = ea);
                string url = "http://" + Channels[len].IpPoint.Address.ToString() + ":" + (Channels[len].IpPoint.Port + 1);
                Dictionary <string, string> header = new Dictionary <string, string>();
                header.Add("Authorization", "Basic " + this.Authorization);

                int           p                   = ea.ActionParam.LastIndexOf(".");
                List <object> eabinary            = Serializer.ToEntity <List <object> >(ea.Binary);
                string        code                = ea.ActionParam.Substring(p + 1);
                Dictionary <string, string> param = new Dictionary <string, string>();
                param.Add("", Serializer.ToString(eabinary));
                var           result = HttpPost.Post(url + "/" + code, param, header);
                DataEventArgs redata = Serializer.ToEntity <DataEventArgs>(result.Item2);

                if (result.Item1 == HttpStatusCode.OK)
                {
                    ea.StatusCode = StatusCode.Success;
                    dynamic dyjs = Serializer.ToEntity <dynamic>(redata.Json);

                    ea.Json = dyjs.data.ToString();

                    ea.Param = redata.Param;
                    ResultTask.AddOrUpdate(ea.TaskId, ea, (key, value) => value = ea);
                }
                else
                {
                    ea.StatusCode = StatusCode.Error;
                    if (HttpStatusCode.Moved == result.Item1)
                    {
                        ea.Json = result.Item2;
                        RuningTask.TryRemove(ea.TaskId, out outDea);
                        Channels[len].Available = false;
                        ClientTask.Enqueue(ea);
                        CheckServer();
                    }
                    else
                    {
                        ea.Json = result.Item2;
                        ResultTask.AddOrUpdate(ea.TaskId, ea, (key, value) => value = ea);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                _log.Error(ex + ex.StackTrace);
                ea.StatusCode = StatusCode.TimeOut;
                ea.TryTimes++;
                if (ea.TryTimes < 3)
                {
                    RuningTask.TryRemove(ea.TaskId, out outDea);
                    ClientTask.Enqueue(ea);
                    return;
                }

                ResultTask.AddOrUpdate(ea.TaskId, ea, (key, value) => value = ea);
                return;
            }
            finally
            {
                for (int i = 0; i < Channels.Count; i++)
                {
                    if (Channels[i].ActiveHash == ea.TaskId)
                    {
                        Channels[i].ActiveHash = 0;
                    }
                }
                RuningTask.TryRemove(ea.TaskId, out outDea);
            }
        }
Ejemplo n.º 3
0
        public virtual DataEventArgs GetResult(DataEventArgs e)
        {
            DataEventArgs arg = new DataEventArgs();

            try
            {
                var cts = new CancellationTokenSource(_config.GetValue("server", "timeout", 15) * 1000);
                while (!cts.Token.IsCancellationRequested)
                {
                    if (ResultTask.TryGetValue(e.TaskId, out arg))
                    {
                        arg.StatusCode = StatusCode.Success;
                        Channels[arg.CallHashCode].ActiveHash = 0;
                        try
                        {
                            StateObject oo = new StateObject();
                            RunStateObjects.TryRemove(arg.TaskId, out oo);
                            if (oo != null)
                            {
                                oo.Builder.ReSet();
                            }
                            DataEventArgs outarg = new DataEventArgs();
                            ResultTask.TryRemove(arg.TaskId, out outarg);
                            RuningTask.TryRemove(arg.TaskId, out outarg);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex);
                        }
                        try
                        {
                            TaskTicks time = new TaskTicks();
                            if (RunTime.TryGetValue(arg.TaskId, out time))
                            {
                                time.EndTime = DateTime.Now.Ticks;
                                RunTime.TryUpdate(arg.TaskId, time, time);
                                _log.Debug("RunTime:\r\n" + arg + "\r\n" + time + "\r\n");
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex);
                        }
                        return(arg);
                    }
                    Thread.Sleep(3);
                }
            }
            catch (Exception ex)
            {
                arg.StatusCode = StatusCode.Serious;
                _log.Error(ex);
                Console.WriteLine(ex);
                Channels[e.CallHashCode].ActiveHash = 0;
                return(arg);
            }
            _log.Info(e.TaskId + "超时");
            _timeoutTask.Add(e);
            e.StatusCode = StatusCode.TimeOut;
            return(e);
        }