Example #1
0
func (r *Runner) runTask(task kit.Task) apperror.Error {
	spec := r.tasks[task.GetName()]
	if spec == nil {
		return apperror.New("unknown_task", fmt.Sprintf("The task %v was not registered with the TaskRunner", task.GetName()))
	}

	now := time.Now()
	task.SetStartedAt(&now)
	task.SetIsRunning(true)
	if err := r.backend.Update(task); err != nil {
		return err
	}

	r.activeTasks[task.GetStrId()] = task

	r.registry.Logger().Debugf("TaskRunner: running task %v (task %v, try %v) (%v tasks running)",
		task.GetStrId(),
		task.GetName(),
		task.GetTryCount()+1,
		len(r.activeTasks))

	go func(task kit.Task) {
		result, err, canRetry := spec.GetHandler()(r.registry, task, r.progressChan)

		now := time.Now()
		task.SetFinishedAt(&now)
		task.SetTryCount(task.GetTryCount() + 1)
		task.SetIsRunning(false)

		if err != nil {
			task.SetError(err.Error())

			if !canRetry || task.GetTryCount() >= spec.GetAllowedRetries() {
				task.SetIsComplete(true)
			} else {
				runAt := time.Now().Add(spec.GetRetryInterval())
				task.SetRunAt(&runAt)
			}
		} else {
			task.SetIsComplete(true)
			task.SetIsSuccess(true)
			task.SetResult(result)
		}

		r.finishedChan <- task
	}(task)

	return nil
}