Ejemplo n.º 1
0
        static void restoreData()   // 从 SQLite 数据库中恢复数据
        // 从缓存库中获取数据
        {
            var context = new StatisticsContext();
            var buffer  = context.Buffer.ToList().ToArray();

            if (buffer.Length > 0)
            {
                // 既然有数据, 那就有缓存。 执行操作恢复缓存
                foreach (var data in buffer)
                {
                    downServerIds.Add(data.identification); // 将标识添加到列表
                    var child = new down()
                    {
                        id      = data.identification,
                        startTS = long.Parse(data.startTS)
                    };
                    downServerList.Add(child);
                }
            }
        }
Ejemplo n.º 2
0
 movement(right, left, down, up, ref endlunchTime, foodexitTime, ref reverseend, ref sleepTime, ref way, NumbersCreater, problems, snakeobjects, ref food);
Ejemplo n.º 3
0
 rb.EmitBinary(down ? BinaryOp.Sub : BinaryOp.Add, counter, cc.Game.One, counter);
Ejemplo n.º 4
0
        private async void tickEvent(object sender, System.Timers.ElapsedEventArgs e)   // 计时器循环事件
        {
            Logger.Debug("计时器循环事件开始执行。");
            // 获取宕机数据
            var downServers = await fetchDownServer(uri);

            Logger.Debug("成功获得宕机数据。");
            string[] diff;
            if (downServers.Length > 0)   // 存在宕机数据
            {
                Logger.Debug("存在宕机事件。");

                // 初始化 ID 组, 缓存目前事件中宕机的 id
                List <string> existIdGroup = new List <string>();
                foreach (var downServer in downServers)
                {
                    // 缓存 id
                    existIdGroup.Add(downServer.id);

                    // 首先检测一下此 id 是否存在
                    var ids = downServerIds.ToArray();
                    if (Array.IndexOf(ids, downServer.id) == -1)           // 如果不存在, 那么就开始通知流程
                    {
                        addLog(downServer.id, "down", downServer.startTs); // 添加故障日志
                        Logger.Debug("标识:" + downServer.id + ", 初次发现宕机, 开始通知流程。");
                        // 首先,初始化 down
                        var child = new down()
                        {
                            id      = downServer.id,
                            startTS = downServer.startTs
                        };

                        var starTime = ConvertTimeStampToDateTime(child.startTS);

                        // 把记录写入缓存列表
                        downServerIds.Add(downServer.id);
                        downServerList.Add(child);

                        Logger.Debug("标识:" + downServer.id + ", 已经将信息写入缓存列表。");

                        // 发送通知任务
                        Logger.Debug("标识:" + downServer.id + " -> 开始读取配置项, 并执行配置映射。");
                        // 读取配置
                        var     parser = new FileIniDataParser();
                        IniData config = parser.ReadFile(configFile);

                        // 映射配置
                        string[] groups = config["notification"]["group"].Split(',');
                        string[] mails  = config["notification"]["mail"].Split(',');

                        // 1. 发送给 QQ 群组
                        Logger.Debug("标识:" + downServer.id + " -> 开始通知群组。");
                        foreach (var group in groups)
                        {
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                            Task.Factory.StartNew(() => {
                                using (var robotSession = MahuaRobotManager.Instance.CreateSession()) {
                                    var api    = robotSession.MahuaApi;
                                    string msg = "警报, 一言节点出现故障!\r\n"
                                                 + "节点标识: " + downServer.id + "\r\n"
                                                 + "触发时间: " + starTime.ToString("s") + "\r\n"
                                                 + fetchHitokotoText();
                                    api.SendGroupMessage(group, msg);
                                    Logger.Debug("标识:" + downServer.id + " -> 已通知群组: " + group);
                                }
                            });
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                        }

                        // 2. 发送广播邮件
                        Logger.Debug("标识:" + downServer.id + " -> 开始邮件通知。");
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                        Task.Factory.StartNew(() => {
                            var smtp = new mailService();
                            var sub  = "一言故障警告";
                            var msg  = "警报, 一言节点出现故障。\r\n"
                                       + "节点标识: " + downServer.id + "\r\n"
                                       + "触发时间: " + starTime.ToString("s") + "\r\n"
                                       + fetchHitokotoText();
                            smtp.Send(mails, sub, msg);
                            Logger.Debug("标识:" + downServer.id + " -> 已通知邮件: " + mails.ToString());
                        });
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                        Logger.Debug("标识:" + downServer.id + " -> 同步任务已经完成, 请等待异步程序执行完毕。");
                    }
                }

                // 求当前宕机列表和缓存列表的补集, 然后通知
                Logger.Debug("正在求当前宕机列表和缓存列表的补集...");
                diff = downServerIds.ToArray().Where(c => !existIdGroup.ToArray().Contains(c)).ToArray();
            }
            else
            {
                diff = downServerIds.ToArray(); // 既然宕机列表不存在, 说明所有节点正常。 如果缓存存在内容, 全部释放。
            }

            if (diff.Length > 0)   // 缓存区 ids 多于目前宕机的 ids, 所以有节点恢复了。 发生恢复行为
            {
                Logger.Debug("补集不为空集, 进行恢复事件。");
                foreach (var id in diff)
                {
                    DateTime startTime = DateTime.Now;
                    // 从缓存区移除
                    Logger.Debug("标识:" + id + " -> 从缓存区中移除纪录。");
                    downServerIds.RemoveAll(c => downServerIds.Contains(c));
                    for (int i = downServerList.Count - 1; i >= 0; i--)
                    {
                        if (downServerList[i].id == id)
                        {
                            startTime = ConvertTimeStampToDateTime(downServerList[i].startTS);
                            downServerList.RemoveAt(i);
                        }
                    }
                    // 获取持续时间
                    var now      = DateTime.Now;
                    var distance = now - startTime;
                    var last     = distance.Days + " 天 " + distance.Hours + " 时 " + distance.Minutes + " 分 " + distance.Seconds + " 秒 ";
                    addLog(id, "up", ConvertDateTimeToTimeStamp(now));

                    Logger.Debug("标识:" + id + " -> 开始读取配置项, 并执行配置映射。");
                    // 读取配置
                    var     parser = new FileIniDataParser();
                    IniData config = parser.ReadFile(configFile);

                    // 映射配置
                    string[] groups = config["notification"]["group"].Split(',');
                    string[] mails  = config["notification"]["mail"].Split(',');

                    // 1. 发送给 QQ 群组
                    Logger.Debug("标识:" + id + " -> 开始通知群组。");
                    foreach (var group in groups)
                    {
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                        Task.Factory.StartNew(() => {
                            using (var robotSession = MahuaRobotManager.Instance.CreateSession()) {
                                var api    = robotSession.MahuaApi;
                                string msg = "一言节点已从故障中恢复。\r\n"
                                             + "节点标识: " + id + "\r\n"
                                             + "持续时间: " + last + "\r\n"
                                             + fetchHitokotoText();
                                api.SendGroupMessage(group, msg);
                                Logger.Debug("标识:" + id + " -> 已通知群组: " + group);
                            }
                        });
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                    }

                    // 2. 发送广播邮件
                    Logger.Debug("标识:" + id + " -> 开始邮件通知。");
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                    Task.Factory.StartNew(() => {
                        var smtp = new mailService();
                        var sub  = "一言已从故障中恢复";
                        var msg  = "一言节点已从故障中恢复。\r\n"
                                   + "节点标识: " + id + "\r\n"
                                   + "持续时间: " + last + "\r\n"
                                   + fetchHitokotoText();
                        smtp.Send(mails, sub, msg);
                        Logger.Debug("标识:" + id + " -> 已通知邮件: " + mails.ToString());
                    });
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                    Logger.Debug("标识:" + id + " -> 同步任务已经完成, 请等待异步程序执行完毕。");
                }
            }
            dumpData();
        }