|
@@ -47,13 +47,26 @@ func (t *TimerSceneService) Add(config string) error {
|
|
|
// server.Log.Errorf("timer scene-manager config error")
|
|
// server.Log.Errorf("timer scene-manager config error")
|
|
|
// return errors.New("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 {
|
|
for _, v := range c.Conditions {
|
|
|
err = t.addTask(c.SceneId, v, c.Actions)
|
|
err = t.addTask(c.SceneId, v, c.Actions)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
server.Log.Errorf("add timerTask error:sceneId:%s, taskId: %s, error: %v", c.SceneId, v.TaskId, err)
|
|
server.Log.Errorf("add timerTask error:sceneId:%s, taskId: %s, error: %v", c.SceneId, v.TaskId, err)
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ addedTaskIds = append(addedTaskIds, v.TaskId)
|
|
|
}
|
|
}
|
|
|
t.task.Set(c.SceneId, c)
|
|
t.task.Set(c.SceneId, c)
|
|
|
server.Log.Debugf("AddTimeScene :%s", c.SceneId)
|
|
server.Log.Debugf("AddTimeScene :%s", c.SceneId)
|
|
@@ -78,6 +91,7 @@ func (t *TimerSceneService) Update(config string) error {
|
|
|
err := json.Unmarshal([]byte(config), &c)
|
|
err := json.Unmarshal([]byte(config), &c)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
server.Log.Errorf("config to timerConfig error :%s", err.Error())
|
|
server.Log.Errorf("config to timerConfig error :%s", err.Error())
|
|
|
|
|
+ return errors.New("timer scene-manager config error")
|
|
|
}
|
|
}
|
|
|
if t.task.Contains(c.SceneId) {
|
|
if t.task.Contains(c.SceneId) {
|
|
|
oldTask := t.task.Get(c.SceneId).(TimerSceneConfig)
|
|
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 {
|
|
for _, v := range c.Conditions {
|
|
|
err = t.addTask(c.SceneId, v, c.Actions)
|
|
err = t.addTask(c.SceneId, v, c.Actions)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
server.Log.Errorf("add timerTask error:sceneId:%s, taskId: %s, error: %v", c.SceneId, v.TaskId, err)
|
|
server.Log.Errorf("add timerTask error:sceneId:%s, taskId: %s, error: %v", c.SceneId, v.TaskId, err)
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
+ addedTaskIds = append(addedTaskIds, v.TaskId)
|
|
|
}
|
|
}
|
|
|
t.task.Set(c.SceneId, c)
|
|
t.task.Set(c.SceneId, c)
|
|
|
server.Log.Debugf("UpdateTimeScene :%s", config)
|
|
server.Log.Debugf("UpdateTimeScene :%s", config)
|