Ver Fonte

fix bug

liuxiulin há 4 semanas atrás
pai
commit
46073e6d33

+ 26 - 1
services/scene-service/internal/service/manager/timer.go

@@ -47,13 +47,26 @@ func (t *TimerSceneService) Add(config string) error {
 	//	server.Log.Errorf("timer scene-manager config error")
 	//	return errors.New("timer scene-manager config error")
 	//}
+	if len(c.Conditions) == 0 || len(c.Actions) == 0 {
+		return errors.New("timer scene-manager config error:conditions or actions is empty")
+	}
+	var addedTaskIds []string
+	defer func() {
+		// 如果添加失败,回滚已添加的Cron任务
+		if err != nil && len(addedTaskIds) > 0 {
+			for _, taskId := range addedTaskIds {
+				t.cron.Remove(taskId)
+			}
+			server.Log.Errorf("add scene %s failed, rollback cron tasks: %v", c.SceneId, addedTaskIds)
+		}
+	}()
 	for _, v := range c.Conditions {
 		err = t.addTask(c.SceneId, v, c.Actions)
 		if err != nil {
 			server.Log.Errorf("add timerTask error:sceneId:%s, taskId: %s, error: %v", c.SceneId, v.TaskId, err)
 			return err
 		}
-
+		addedTaskIds = append(addedTaskIds, v.TaskId)
 	}
 	t.task.Set(c.SceneId, c)
 	server.Log.Debugf("AddTimeScene :%s", c.SceneId)
@@ -78,6 +91,7 @@ func (t *TimerSceneService) Update(config string) error {
 	err := json.Unmarshal([]byte(config), &c)
 	if err != nil {
 		server.Log.Errorf("config to timerConfig error :%s", err.Error())
+		return errors.New("timer scene-manager config error")
 	}
 	if t.task.Contains(c.SceneId) {
 		oldTask := t.task.Get(c.SceneId).(TimerSceneConfig)
@@ -86,12 +100,23 @@ func (t *TimerSceneService) Update(config string) error {
 		}
 	}
 
+	var addedTaskIds []string
+	defer func() {
+		if err != nil && len(addedTaskIds) > 0 {
+			for _, taskId := range addedTaskIds {
+				t.cron.Remove(taskId)
+			}
+			server.Log.Errorf("update scene %s failed, rollback new cron tasks: %v", c.SceneId, addedTaskIds)
+		}
+	}()
+
 	for _, v := range c.Conditions {
 		err = t.addTask(c.SceneId, v, c.Actions)
 		if err != nil {
 			server.Log.Errorf("add timerTask error:sceneId:%s, taskId: %s, error: %v", c.SceneId, v.TaskId, err)
 			return err
 		}
+		addedTaskIds = append(addedTaskIds, v.TaskId)
 	}
 	t.task.Set(c.SceneId, c)
 	server.Log.Debugf("UpdateTimeScene :%s", config)

+ 2 - 2
services/scene-service/internal/service/scene.go

@@ -105,7 +105,7 @@ func (m *SceneService) SubmitAction(args rpcs.ArgsSubmitSceneAction, reply *rpcs
 		m.scenes.Set(scene.Id, scene)
 		return m.saveSceneRedis(scene)
 	case "start":
-		err = srv.Start(scene.Config)
+		err = srv.Start(scene.Id)
 		if err != nil {
 			server.Log.Errorf("start scene error: Id: %s, error: %v\n", scene.Id, err)
 			return err
@@ -114,7 +114,7 @@ func (m *SceneService) SubmitAction(args rpcs.ArgsSubmitSceneAction, reply *rpcs
 		m.scenes.Set(scene.Id, scene)
 		return m.saveSceneRedis(scene)
 	case "stop":
-		err = srv.Stop(scene.Config)
+		err = srv.Stop(scene.Id)
 		if err != nil {
 			server.Log.Errorf("stop scene error: Id: %s, error: %v\n", scene.Id, err)
 			return err