From 4a3f246ed33ea2a9ad8f6e43812ade02427dbba3 Mon Sep 17 00:00:00 2001
From: miraclesu <suchuangji@gmail.com>
Date: Tue, 17 Jan 2017 16:40:12 +0800
Subject: [PATCH] =?UTF-8?q?node:=20=E4=BF=AE=E6=94=B9=20job=20=E8=A7=84?=
 =?UTF-8?q?=E5=88=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

单个 job 在单个结点上只支持单个时间规则
方便 job 更新
---
 models/job.go | 30 ++++++++++++++++++------------
 node/node.go  | 11 +++--------
 2 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/models/job.go b/models/job.go
index f1d47b1..b0ac581 100644
--- a/models/job.go
+++ b/models/job.go
@@ -24,7 +24,10 @@ type Job struct {
 	Rule    []*JobRule `json:"rule"`
 	Pause   bool       `json:"pause"` // 可手工控制的状态
 
-	Schedules map[string][]string `json:"-"` // map[ip][]timer node 服务使用
+	// map[ip]timer node 服务使用
+	// 每个任务在单个结点上只支持一个时间规则
+	// 如果需要多个时间规则,需建新的任务
+	Schedules map[string]string `json:"-"`
 }
 
 type JobRule struct {
@@ -77,36 +80,39 @@ func GetJobs() (jobs map[string]*Job, err error) {
 }
 
 func (j *Job) BuildSchedules(gs map[string]*Group) {
-	j.Schedules = make(map[string][]string)
+	j.Schedules = make(map[string]string)
 	for _, r := range j.Rule {
-		sch := make(map[string]string)
 		for _, gid := range r.GroupIDs {
 			g, ok := gs[gid]
 			if !ok {
 				continue
 			}
 			for _, id := range g.NodeIDs {
-				sch[id] = r.Timer
+				if t, ok := j.Schedules[id]; ok {
+					log.Warnf("job[%s] already exists timer[%s], timer[%s] will skip", j.ID, t, r.Timer)
+					continue
+				}
+				j.Schedules[id] = r.Timer
 			}
 		}
 
 		for _, id := range r.NodeIDs {
-			sch[id] = r.Timer
+			if t, ok := j.Schedules[id]; ok {
+				log.Warnf("job[%s] already exists timer[%s], timer[%s] will skip", j.ID, t, r.Timer)
+				continue
+			}
+			j.Schedules[id] = r.Timer
 		}
 
 		for _, id := range r.ExcludeNodeIDs {
-			delete(sch, id)
-		}
-
-		for id, t := range sch {
-			j.Schedules[id] = append(j.Schedules[id], t)
+			delete(j.Schedules, id)
 		}
 	}
 }
 
-func (j *Job) Schedule(id string) ([]string, bool) {
+func (j *Job) Schedule(id string) (string, bool) {
 	if len(j.Schedules) == 0 {
-		return nil, false
+		return "", false
 	}
 
 	s, ok := j.Schedules[id]
diff --git a/node/node.go b/node/node.go
index 123de84..9e45f25 100644
--- a/node/node.go
+++ b/node/node.go
@@ -85,17 +85,12 @@ func (n *Node) Register() (err error) {
 
 func (n *Node) addJobs() {
 	for _, job := range n.jobs {
-		schs, ok := job.Schedule(n.ID)
+		sch, ok := job.Schedule(n.ID)
 		if !ok {
-			log.Warnf("job[%s] has no schedules, will skip", job.ID)
 			continue
 		}
-
-		for _, sch := range schs {
-			if err := n.Cron.AddJob(sch, job); err != nil {
-				log.Warnf("job[%s] timer[%s] parse err: %s", job.ID, sch)
-				continue
-			}
+		if err := n.Cron.AddJob(sch, job); err != nil {
+			log.Warnf("job[%s] timer[%s] parse err: %s", job.ID, sch)
 		}
 	}
 }