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); }
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); } }
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); }