Exemplo n.º 1
0
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()
}
Exemplo n.º 2
0
func Do(w http.ResponseWriter, req *http.Request) {
	method := req.URL.Query().Get("method") //本期任务method就当做taskid使用了,所以 method每次发送过来的时候必须有一个特别的值
	process.SendTask(method)
}