package websrv import ( "errors" "sync" "xiawan/wx/clientsdk/baseinfo" ) // WebTaskMgr web任务管理器 type WebTaskMgr struct { // wxConn wxface.IWXConnect taskChan chan *WebTask endChan chan bool isStart bool } // 全局只能定义一个 var WebTaskMgrInit *WebTaskMgr = &WebTaskMgr{ taskChan: make(chan *WebTask, 100), endChan: make(chan bool, 1), isStart: false, } var globalLock sync.Mutex = sync.Mutex{} // NewWebTaskMgr 新建web任务管理器 func NewWebTaskMgr() *WebTaskMgr { globalLock.Lock() defer globalLock.Unlock() return WebTaskMgrInit } // Start 开启 func (wtm *WebTaskMgr) Start() { globalLock.Lock() defer globalLock.Unlock() if wtm.isStart { return } wtm.isStart = true go wtm.queryAndExecuteTask() } // Stop 关闭 func (wtm *WebTaskMgr) Stop() { wtm.isStart = false wtm.endChan <- true } // AddWebTask 新增Web任务 func (wtm *WebTaskMgr) retSetWebTask(webTask *WebTask) { // 最多三次 if webTask.Count >= 2 { return } webTask.Count++ wtm.taskChan <- webTask } // AddWebTask 新增Web任务 func (wtm *WebTaskMgr) AddWebTask(userInfo *baseinfo.UserInfo, taskInfo *TaskInfo, status string, tmpType uint32, connectInfo map[string]interface{}) { if !wtm.isStart { return } globalLock.Lock() defer globalLock.Unlock() newWebTask := &WebTask{} newWebTask.ConnectInfo = connectInfo newWebTask.TaskInfo = taskInfo newWebTask.UserInfo = userInfo newWebTask.Status = status newWebTask.Type = tmpType newWebTask.Count = 0 wtm.taskChan <- newWebTask } func (wtm *WebTaskMgr) queryAndExecuteTask() { for { select { case webTask := <-wtm.taskChan: if webTask.Type == TaskTypeUploadStatus { err := errors.New("") // err := UploadTaskStatus(webTask) // if err != nil && webTask.Status != TaskStateCheckLoginQrcodeSuccess { // wtm.retSetWebTask(webTask) // continue // } // 登陆成功上报 if webTask.Status == TaskStateLoginSuccess { err = ReportWechatStatus(webTask, "1") if err != nil { wtm.retSetWebTask(webTask) continue } } // 退出登陆上报 if webTask.Status == TaskStateLogout { err = ReportWechatStatus(webTask, "0") if err != nil { wtm.retSetWebTask(webTask) continue } } } else if webTask.Type == TaskTypeReportHeart { // 上报心跳包 } continue case <-wtm.endChan: return } } }