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); } } }
movement(right, left, down, up, ref endlunchTime, foodexitTime, ref reverseend, ref sleepTime, ref way, NumbersCreater, problems, snakeobjects, ref food);
rb.EmitBinary(down ? BinaryOp.Sub : BinaryOp.Add, counter, cc.Game.One, counter);
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(); }