private static Task SyncConsume(List <SensorAcqResult> result, int index) { DacTaskResultConsumerQueue queue = Queues[index]; try { var resultCopy = ObjectHelper.DeepCopy(result); // 同步队列共享一个深拷贝副本 var t = new Task( () => { for (int i = 0; i < queue.Length; i++) { try { var consumer = queue[i]; if (consumer == null) { Log.ErrorFormat("queue[{0}]'s consumer is null ", i); continue; } long started = DateTime.Now.Millisecond; Log.DebugFormat( "[Consumer] of P{0}: {1}-{2}, sensors={3}", index, i, consumer.GetType(), string.Join(",", result.Select(s => s.Sensor.SensorID).ToArray())); consumer.ProcessResult(resultCopy); Log.DebugFormat( "[Consumer] {0} done in {1} ms.", queue[i].GetType(), DateTime.Now.Millisecond - started); } catch (Exception e) { Log.Error(string.Format("{0} exec error", queue[i].GetType()), e); } } }, TaskCreationOptions.AttachedToParent); t.Start(); return(t); } catch (Exception e) { Log.Error("consumer queue error", e); return(null); } }
private static Task AsyncConsume(List <SensorAcqResult> result, int index) { DacTaskResultConsumerQueue queue = Queues[index]; var pt = new Task( () => { for (int i = 0; i < queue.Length; i++) { try { var consumer = queue[i]; if (consumer == null) { Log.ErrorFormat("queue[{0}]'s consumer is null ", i); continue; } var resultCopy = ObjectHelper.DeepCopy(result); // 异步队列每个消费者一个深拷贝副本 var t = new Task(() => consumer.ProcessResult(resultCopy), TaskCreationOptions.AttachedToParent); var number = index; t.Start(); Log.DebugFormat("consumer:[{0}] start..", consumer.GetType()); t.ContinueWith( task => { if (task.Exception != null) { Log.ErrorFormat("queue:{0}-consumer:{1} exec error", number, consumer.GetType()); } }); } catch (Exception e) { Log.Error("consumer queue error", e); } } }, TaskCreationOptions.AttachedToParent); pt.Start(); return(pt); }
public static void Init() { Consumers = new Dictionary <string, Type>(); Queues = new List <DacTaskResultConsumerQueue>(); if (System.IO.File.Exists(AppDomain.CurrentDomain.BaseDirectory + " \\consumers.xml")) { try { var doc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "\\consumers.xml"); // 注册消费者 var consumerNodes = doc.Root.Element("consumers").Elements(); foreach (var node in consumerNodes) { var consumerName = node.Attribute("name").Value; var assembly = node.Attribute("assembly").Value; var consumerType = node.Attribute("type").Value; var type = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "\\" + assembly).GetType(consumerType); RegisterConsumer(consumerName, type); } // 解析消费队列 var queuesNodes = doc.Root.Element("queues").Elements("queue"); int num = 0; foreach (var node in queuesNodes) { var consumeType = (node.Attribute("sync") == null || node.Attribute("sync").Value == "true") ? ConsumeType.Sync : ConsumeType.Async; var queue = new DacTaskResultConsumerQueue(consumeType); var queueNodes = node.Elements(); var consumers = new List <string>(); foreach (var qn in queueNodes) { var name = qn.Attribute("name").Value; var consumer = GetConsumer(name); var sensorTypeFilter = qn.Attribute("sensorType"); if (sensorTypeFilter != null) { var filterStr = sensorTypeFilter.Value.Split(','); List <SensorType> l = new List <SensorType>(); foreach (var s in filterStr) { SensorType st; if (!Enum.TryParse(s.Trim(), true, out st)) { Log.Warn("queue " + name + " sensorType invalid." + sensorTypeFilter); break; } l.Add(st); } consumer.SensorTypeFilter = l.ToArray(); } queue.Enqueue(consumer); consumers.Add(name); } Queues.Add(queue); Log.Debug("queue_" + ++num + ":" + string.Join(",", consumers)); } } catch (Exception e) { Log.Warn("consumer.xml parse error", e); } } else { Log.Warn("consumer.xml not found"); } }
/// <summary> /// 添加消费者队列(各消费队列之间是并行的) /// </summary> /// <param name="queue"></param> public static void AddComsumerQueue(DacTaskResultConsumerQueue queue) { Queues.Add(queue); }