Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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");
            }
        }
Exemple #4
0
 /// <summary>
 /// 添加消费者队列(各消费队列之间是并行的)
 /// </summary>
 /// <param name="queue"></param>
 public static void AddComsumerQueue(DacTaskResultConsumerQueue queue)
 {
     Queues.Add(queue);
 }