Example #1
0
        public void Start(out string errMsg)
        {
            errMsg = "";
            if (IsRuning)
            {
                return;
            }

            // 加载日志数据发布服务所需配置文件信息
            this.mqttParam = new MQTTParam();
            if (!LoadConfig(out errMsg))
            {
                return;
            }

            // 检查端口是否空闲
            if (!IPTool.IsValidPort(this.mqttParam.port))
            {
                errMsg = "日志服务器的发布端口被占用,请更换端口号";
                return;
            }

            // 开启MQTT服务当做发布器
            mqttServer = new MQTTServer(mqttParam);
            mqttServer.Start(out errMsg);
            if (!mqttServer.IsRuning || !string.IsNullOrWhiteSpace(errMsg))
            {
                Stop();
                return;
            }

            // 开启消息队列的消费器
            queue = new BlockingCollection <TraceItem>();
            task  = new Task(() =>
            {
                foreach (TraceItem item in queue.GetConsumingEnumerable())
                {
                    try
                    {
                        ActionTimeout <TraceItem> timeout = new ActionTimeout <TraceItem>();
                        timeout.Do     = Excute;
                        bool isTimeout = timeout.DoWithTimeout(item, TimeSpan.FromSeconds(5)); //只等待5秒
                        if (isTimeout)                                                         // 超时
                        {
                            GC.Collect();
                        }
                    }
                    catch
                    {
                    }
                }
            }, TaskCreationOptions.LongRunning);
            task.Start();
            IsRuning = true;
        }
Example #2
0
        public void Stop()
        {
            // 关闭消息队列的消费器
            // 先完成添加
            queue.CompleteAdding();
            DateTime time1 = DateTime.Now;

            while (queue.Count > 0)
            {
                Thread.Sleep(1);
                // 最多等待10秒避免关不掉
                if (DateTime.Now - time1 > TimeSpan.FromSeconds(10))
                {
                    break;
                }
            }
            while (queue.Count > 0)
            {
                // 等了十秒还没听,队列全部元素废弃
                queue.Take();
            }

            queue = null;
            Task.WaitAll(task);
            task.Dispose();
            task = null;

            // 关闭发布器
            if (mqttServer != null)
            {
                mqttServer.Stop();
                mqttServer = null;
            }

            IsRuning = false;
        }