func watchslavers() { _, _, session1, err := zk.ChildrenW(utils.Cfg.GetString("sendslavers")) if err != nil { // log.Fatalf("Can't connect: %v", err) fmt.Println(err) } event := <-session1 alivedset := hashset.New() deadset := hashset.New() alivedset.Clear() deadset.Clear() if event.Type == zookeeper.EVENT_CHILD { slavers, _, err2 := zk.Children(utils.Cfg.GetString("sendslavers")) if err2 != nil { // log.Fatalf("Can't connect: %v", err) fmt.Println(err2) } for _, slaver := range slavers { // utils.AddlivedSlavers(slaver) alivedset.Add(slaver) } } for _, oldslave := range utils.GetlivedSlavers().Values() { if oldslave == nil { break } alivedset.Contains(oldslave) //判断获取的活着的slave里面是否包换之前的活着的列表里面的slave,如果没有,说明过去的节点死了 deadset.Add(oldslave) } utils.SetlivedSlavers(alivedset) //容错,重新下发死了的节点的任务 for _, slave := range deadset.Values() { utils.RemlivedSlaver(slave.(string)) utils.RemhealthSlaver(slave.(string)) taskid, _ := utils.TakeTask(slave.(string)) utils.RemhealthslaveAndtask(slave.(string)) utils.RemhealthtaskAndslave(taskid.(string)) //重新发送任务 process.SendTask(taskid.(string)) } watchslavers() }
func Do(w http.ResponseWriter, req *http.Request) { method := req.URL.Query().Get("method") //本期任务method就当做taskid使用了,所以 method每次发送过来的时候必须有一个特别的值 process.SendTask(method) }