panlei
2019-09-17 6351ababead17e120b146a4b3f37c4e49ca64268
给定时器加锁
2个文件已修改
14 ■■■■■ 已修改文件
ruleserver/ruleToformula.go 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/timeTicker.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go
@@ -6,6 +6,7 @@
    "sort"
    "strconv"
    "strings"
    "sync"
    "time"
    "basic.com/pubsub/protomsg.git"
@@ -110,6 +111,8 @@
    Result  string // 已包含了前置连接符
    Sort    int32
}
var rw sync.RWMutex // 读写锁
// 对单帧图像的判断 thisSdkDatas  当前传入的这帧数据,cacheSdkData 定时器里缓存的一帧数据 没有就返回nil  (thisSdkDatas SdkDatas, cacheSdkDatas SdkDatas)
func Judge(args *SdkDatas, message *protomsg.SdkMessage) {
@@ -420,6 +423,7 @@
    logger.Info("------------------------------------------当前是联动任务,规则是:", groupRule.GroupText)
    var flag bool = true
    var timeEle = TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId}
    rw.Lock()
    for k, timeEle1 := range TimeEleList {
        if k == groupRule.GroupId {
            flag = false // 已经有了这个定时器就置为false 不再新增
@@ -449,7 +453,7 @@
            }
        }
    }
    logger.Info("")
    rw.Unlock()
    // 往数组里赋值
    isOk,labelTypes := RunRule(args, groupRule, taskId, message, label)
    if isOk {
@@ -501,6 +505,7 @@
                result, _ := expression.Evaluate(nil) // 得到数学公式的结果
                if result.(bool) {
                    logger.Info("___________________________________________________________________联动任务报警")
                    rw.RLock()
                    if TimeEleList[groupRule.GroupId] != nil {  // 极偶尔有情况会等于nil,不知道为啥,做个判断以防宕机
                        // 把数组里缓存的数据取出来一起报警
                        label.LinkCache = []ResultMsg{}
@@ -519,6 +524,7 @@
                            }
                        }
                    }
                    rw.RUnlock()
                }
            }
        } else {
@@ -549,12 +555,14 @@
        //        va.Result = strconv.FormatBool(isOk)
        //    }
        //}
        rw.Lock()
        for k, _ := range TimeEleList {
            if k == groupRule.GroupId {
                delete(TimeEleList, k)
                logger.Debug("因为定时器的一帧数据结果为false,干掉定时器")
            }
        }
        rw.Unlock()
        // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西
    }
@@ -701,6 +709,7 @@
        if rule.SdkArgAlias == "duration" { //
            logger.Info("当前小规则是:---------", rule)
            // 先看看定时器元素队列中是否有这条规则的定时器,如果有就不能再次创建了
            rw.Lock()
            var flag bool = true
            for k, _ := range TimeEleList {
                if k == groupId+"+"+rule.Id {
@@ -716,6 +725,7 @@
                TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键
                logger.Info("创建了计数器")
            }
            rw.Unlock()
        }
    }
}
ruleserver/timeTicker.go
@@ -71,6 +71,7 @@
    var flagTime string //
    // 判断有无此规则组的定时器
    flag := false
    rw.Lock()
    for k, _ := range TimeEleList {
        //logger.Debug("-----------------看看这个key和groupId", k, groupId)
        if strings.Contains(k, groupId) && k != groupId{
@@ -132,6 +133,7 @@
            flagTime = "00"
        }
    }
    rw.Unlock()
    return flagTime
}