/// <summary> /// 转发报警到上级 /// </summary> /// <param name="alarmLog"></param> private void ForwardAlarmToTopOrganization(AlarmLog alarmLog) { Task.Run(() => { using (var db = new AllInOneContext.AllInOneContext()) { string error = ""; var topApplicationCenter = db.Organization.Include(t => t.Center). OrderBy(t => t.OrganizationFullName). Select(t => t.Center). FirstOrDefault(); if (topApplicationCenter != null && topApplicationCenter.EndPoints != null && topApplicationCenter.EndPoints.Count > 0) { _logger.LogInformation("开始推送{1}发生的{2}报警消息到上级系统...", alarmLog.AlarmSource.IPDeviceName, alarmLog.AlarmType.SystemOptionName); EndPointInfo endPoint = topApplicationCenter.EndPoints.First(); string url = string.Format("http://{0}:{1}/Alarm/AlarmLog/Publish", endPoint.IPAddress, endPoint.Port); _logger.LogInformation("推送URL:{0}...", url); var result = HttpClientHelper.Post <AlarmLog>(alarmLog, url, false); if (result.Success) { alarmLog.UploadStatus = 1; db.SaveChanges(); _logger.LogInformation("报警消息推送到上级系统成功"); } else { _logger.LogInformation("报警消息推送到上级系统失败,原因:{0},将推送添加到报警转发队列", result); ForwardAlarmLogTask.Instance.ForwardAlarmLog(alarmLog); } } else { error = "未配置上级应用服务"; } if (!string.IsNullOrEmpty(error)) { error = string.Format("由于{0},推送{1}发生的{2}报警消息到上级系统失败!", error, alarmLog.AlarmSource.IPDeviceName, alarmLog.AlarmType.SystemOptionName); ForwardAlarmLogError forwardErr = new ForwardAlarmLogError() { ErrorDesc = error, CreateTime = DateTime.Now }; MQPulish.PublishMessage("ForwardAlarmLogError", forwardErr); //改为提示..... } } }); }
public void Run() { Task.Factory.StartNew(() => { _logger.LogInformation("Start forward alarmlog task......"); while (true) { if (m_alarmLogList.Count == 0) { m_forwardWaiter.WaitOne(-1); } using (var db = new AllInOneContext.AllInOneContext()) { //默认第一个为本地应用中心节点() var topApplicationCenter = db.Organization.Include(t => t.Center). OrderBy(t => t.OrganizationFullName).Select(t => t.Center). FirstOrDefault(); if (topApplicationCenter == null || topApplicationCenter.EndPoints == null || topApplicationCenter.EndPoints.Count == 0) { _logger.LogInformation("未配置上级服务器IP,报警上传等待10 min后再检测......"); m_forwardWaiter.WaitOne(10 * 60000); continue; } EndPointInfo endPoint = topApplicationCenter.EndPoints.First(); string url = string.Format("http://{0}:{1}/Alarm/AlarmLog/Publish", endPoint.IPAddress, endPoint.Port); //上传报警记录 string error = ""; lock (m_logLockObj) { for (int i = m_alarmLogList.Count - 1; i >= 0; i--) { AlarmLog log = m_alarmLogList[i]; if (log.UploadCount < 10) { var result = HttpClientHelper.Post <AlarmLog>(log, url); if (result.Success) { log.UploadStatus = 1; //上传完成 } else { log.UploadCount++; } db.AlarmLog.Update(log); db.SaveChanges(); m_alarmLogList.RemoveAt(i); } else if (log.UploadCount == 10) { //上传次数达到10次,记录.... log.UploadCount++; db.AlarmLog.Update(log); db.SaveChanges(); m_alarmLogList.Remove(log); //广播消息 error = string.Format("多次尝试推送报警失败,取消推送{0}发生的{1}报警消息到上级系统!", log.AlarmSource.IPDeviceName, log.AlarmType.SystemOptionName); ForwardAlarmLogError forwardErr = new ForwardAlarmLogError() { ErrorDesc = error, CreateTime = DateTime.Now }; MQPulish.PublishMessage("ForwardAlarmLogError", forwardErr); } } } } // m_uploadWaiter.WaitOne(10 * 1000); } }); }