diff --git a/business/jxutils/tasksch/parallel_task.go b/business/jxutils/tasksch/parallel_task.go index bab59065a..39a867593 100644 --- a/business/jxutils/tasksch/parallel_task.go +++ b/business/jxutils/tasksch/parallel_task.go @@ -123,7 +123,9 @@ func (task *ParallelTask) Run() { chanRetVal = retVal goto end } else { - result, err := task.worker(task, job, task.params...) + result, err := task.callWorker(func() (retVal interface{}, err error) { + return task.worker(task, job, task.params...) + }) // globals.SugarLogger.Debugf("ParallelTask.Run %s, after call worker result:%v, err:%v", task.Name, result, err) task.finishedOneJob(len(job), err) if err == nil { @@ -146,11 +148,7 @@ func (task *ParallelTask) Run() { } end: // globals.SugarLogger.Debugf("ParallelTask.Run %s, put to chann chanRetVal:%v", task.Name, chanRetVal) - task.locker.RLock() - if task.Status < TaskStatusEndBegin { - task.subFinishChan <- chanRetVal - } - task.locker.RUnlock() + task.subFinishChan <- chanRetVal }) } for _, job := range task.jobList { diff --git a/business/jxutils/tasksch/sequence_task.go b/business/jxutils/tasksch/sequence_task.go index a11a957c8..74f719f2a 100644 --- a/business/jxutils/tasksch/sequence_task.go +++ b/business/jxutils/tasksch/sequence_task.go @@ -39,7 +39,9 @@ func (task *SeqTask) Run() { goto EndFor default: } - result, err := task.worker(task, i, task.params...) + result, err := task.callWorker(func() (retVal interface{}, err error) { + return task.worker(task, i, task.params...) + }) task.finishedOneJob(1, err) if taskErr = err; taskErr != nil { globals.SugarLogger.Infof("SeqTask.Run %s step:%d failed with error:%v", task.Name, i, err) diff --git a/business/jxutils/tasksch/task.go b/business/jxutils/tasksch/task.go index a7aac15c2..52b991888 100644 --- a/business/jxutils/tasksch/task.go +++ b/business/jxutils/tasksch/task.go @@ -352,3 +352,14 @@ func (t *BaseTask) buildTaskErrFromDetail() (err error) { } return nil } + +func (task *BaseTask) callWorker(worker func() (retVal interface{}, err error)) (retVal interface{}, err error) { + defer func() { + if r := recover(); r != nil { + globals.SugarLogger.Errorf("callWorker panic:%v", r) + err = fmt.Errorf("panic, r:%v", r) + } + }() + retVal, err = worker() + return retVal, err +}