浏览代码

fix:调整每日指标数据提醒的逻辑,修复清除已通知任务的协程不退出bug,避免内存溢出

Roc 3 年之前
父节点
当前提交
2c969b2c50
共有 1 个文件被更改,包括 54 次插入35 次删除
  1. 54 35
      services/task.go

+ 54 - 35
services/task.go

@@ -61,8 +61,10 @@ func Task() {
 	//GetLzProductList()GetLzProductDetail
 
 	// 定时新增手工指标数据提醒
-	addEdbTask := task.NewTask("sendWaitReport", "0 * * * * * ", AddEdbTask)
+	addEdbTask := task.NewTask("sendWaitReport", "1 0 0 * * * ", AddEdbTask)
 	task.AddTask("定时新增手工指标数据提醒", addEdbTask)
+	//每次服务启动都需要执行一次的
+	_ = AddEdbTask(nil)
 
 	fmt.Println("task end")
 }
@@ -202,25 +204,30 @@ endData:=time.Now().UnixNano()/1e6
 	fmt.Println(dateTime)
 */
 
-func AddEdbTask(cont context.Context) (err error) {
-	//每次先清除掉昨天的定时任务,再次开启今天的定时任务
-	for taskName := range TaskNameMap {
-		task.DeleteTask(taskName)
-		delete(TaskNameMap, taskName)
-	}
-	edbTaskAddTask()
-	return
-}
+// EdbTaskNameMap 手工指标定时任务名称map集合
+var EdbTaskNameMap map[string]map[string]bool
 
-// TaskNameMap 定时任务名称map集合
-var TaskNameMap map[string]bool
+// EdbTaskNameChannel 手工指标定时任务名称channel
+var EdbTaskNameChannel chan string
 
-func edbTaskAddTask() {
+// EdbTaskStopChannel 手工指标定时任务停止channel
+var EdbTaskStopChannel chan string
+
+// EdbTaskRunNum 手工指标定时任务开始次数
+var EdbTaskRunNum int
+
+// AddEdbTask 新增手工指标数据录入提醒
+func AddEdbTask(cont context.Context) (err error) {
+	//func AddEdbTask() (err error) {
 	list, err := models.GetEdbInfoByFrequencyNotDay()
 	if err != nil {
 		fmt.Println("查询获取频度非日度 且 提醒时间不为空 的指标数据失败,Err:", err.Error())
 	}
-	TaskNameMap = make(map[string]bool)
+	//如果还没有初始化map,那么先初始
+	if EdbTaskNameMap == nil {
+		EdbTaskNameMap = make(map[string]map[string]bool)
+	}
+	tmpEdbTaskNameMap := make(map[string]bool)
 
 	// 今天的日期字符串(格式:2021-10-25)
 	todayStr := time.Now().Format(utils.FormatDate)
@@ -248,11 +255,6 @@ func edbTaskAddTask() {
 	//失败列表
 	failList := make([]string, 0)
 
-	//定时任务
-	edbTaskNameChannel := make(chan string)
-	//定时任务数量
-	taskNum := 0
-
 	//task.globalTaskManager.adminTaskList
 	for _, edb := range list {
 		tmpEdb := edb            //指标信息
@@ -369,14 +371,14 @@ func edbTaskAddTask() {
 		}
 
 		if isNotice {
-			taskName := "edb_task_" + fmt.Sprint(edb.TradeCode)
+			taskName := "edb_task_" + todayStr + ":" + fmt.Sprint(edb.TradeCode)
 			fmt.Println(taskName, ";", edb.SecName)
 
 			//定时任务
 			tmpTaskFunc := func(ctx context.Context) (funcErr error) {
 				//方法执行结束后,移除定时任务
 				defer func() {
-					edbTaskNameChannel <- taskName
+					EdbTaskNameChannel <- taskName
 				}()
 				// 匿名方法内判断是否发送提醒,因为可能时间到的时候,发现
 				funcIsNotice := false
@@ -390,7 +392,7 @@ func edbTaskAddTask() {
 				}
 				if utils.RunMode == "debug" {
 					//tmpEdb.UserId = 44078 //测试环境的话,发送邮箱给颜鹏
-					tmpEdb.UserId = 29775 //测试环境的话,发送邮箱给嘉豪
+					tmpEdb.UserId = 51655 //测试环境的话,发送邮箱给嘉豪
 
 				}
 
@@ -550,10 +552,6 @@ func edbTaskAddTask() {
 					keyword1 := tmpEdb.SecName
 					keyword2 := "每周 " + edb.NoticeTime
 					remark := tmpEdb.SecName + "该更新了"
-					fmt.Println("开始发送模板消息了")
-					for _, openid := range openIdList {
-						fmt.Println(openid)
-					}
 
 					err = SendWxMsgWithFrequency(first, keyword1, keyword2, remark, openIdList)
 					if err != nil {
@@ -587,23 +585,44 @@ func edbTaskAddTask() {
 			tmpTask := task.NewTask(taskName, spec, tmpTaskFunc)
 
 			task.AddTask(taskName, tmpTask)
-			TaskNameMap[taskName] = true
-			taskNum++
+			tmpEdbTaskNameMap[taskName] = true
 		}
 	}
 
-	//清除定时任务
-	go deleteTask(edbTaskNameChannel, taskNum)
+	//将当天的手工指标加入到手工指标池去
+	EdbTaskNameMap[todayStr] = tmpEdbTaskNameMap
+	//开启协程,用来清除定时任务
+	go deleteTask()
+
+	//如果当前定时任务执行次数大于0次,那么需要往手工指标定时任务停止channel写入数据,用来关闭昨天没有执行的的定时任务
+	if EdbTaskRunNum > 0 {
+		//清除昨天的数据
+		EdbTaskStopChannel <- time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
+	}
+	//手工指标定时任务开始次数累加
+	EdbTaskRunNum++
 
 	for _, v := range failList {
 		fmt.Println(v)
 	}
+	return
 	//fmt.Println(task.NewMapSorter())
 }
-func deleteTask(keyChannel chan string, lenI int) {
-	for i := 0; i < lenI; i++ {
-		taskName := <-keyChannel
-		task.DeleteTask(taskName)
-		delete(TaskNameMap, taskName)
+
+// deleteTask 清除已通知的任务
+func deleteTask() {
+	for {
+		select {
+		case taskName := <-EdbTaskNameChannel:
+			task.DeleteTask(taskName)
+			delete(EdbTaskNameMap, taskName)
+
+		case dayStr := <-EdbTaskStopChannel: //收到停止信号,先清除掉那一天的定时任务,
+			for taskName := range EdbTaskNameMap[dayStr] {
+				task.DeleteTask(taskName)
+				delete(EdbTaskNameMap, taskName)
+			}
+			break
+		}
 	}
 }