public override void Execute(LongRunArgs <T> args) { LongRunInfo longRunInfo; using (var unitOfWork = UnitOfWorkManager.Begin()) { longRunInfo = LongRunInfoRepository.Get(args.LongRunInfoId); if (longRunInfo.LongRunStatus != LongRunStatus.Queued) { return; } longRunInfo.LongRunStatus = LongRunStatus.InProcess; longRunInfo.Abortable = Abortable; unitOfWork.Complete(); } LongRunStatus? result = null; CancellationToken token; if (Abortable) { token = CancellationWorker.AddOrGet(longRunInfo.Id); } else { token = default; } string error = null; try { result = ExecuteRaw(args.Args, longRunInfo, token); } catch (Exception e) { error = e.ToString(); } using (var unitOfWork = UnitOfWorkManager.Begin()) { longRunInfo = LongRunInfoRepository.Get(longRunInfo.Id); if (error != null) { longRunInfo.Error += string.IsNullOrEmpty(longRunInfo.Error) ? error : Environment.NewLine + error; } if (result != null) { longRunInfo.LongRunStatus = result.Value; } unitOfWork.Complete(); } CancellationWorker.Remove(longRunInfo.Id); }
public async Task <LongRunResult> EnqueueLongRunAsync <TJob, TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan?delay = null) where TJob : LongRunBackgroundJob <TArgs> { LongRunInfo longRunInfo; string longRunId; // i removed try catches for persisting. // let it be handled by unit of work and thorwing exceptions using (var unitOfWork = UnitOfWorkManager.Begin()) { longRunId = _keyGenerator.Generate <string>(); longRunInfo = new LongRunInfo { Id = longRunId, //todo: serializer? or json repo? Args = JsonConvert.SerializeObject(args), LongRunStatus = LongRunStatus.Queued, Type = typeof(TJob).ToString(), }; await _longRunInfoRepo.InsertAsync(longRunInfo); await unitOfWork.CompleteAsync(); } string jobId; try { // try to queue job var longRunArgs = new LongRunArgs <TArgs> { Args = args, LongRunInfoId = longRunId }; jobId = await EnqueueAsync <TJob, LongRunArgs <TArgs> >(longRunArgs, priority, delay); } catch (Exception e) { try { using (var unitOfWork = UnitOfWorkManager.Begin()) { longRunInfo = await _longRunInfoRepo.GetAsync(longRunInfo.Id); longRunInfo.LongRunStatus = LongRunStatus.QueueFailed; longRunInfo.Error = e.ToString(); await unitOfWork.CompleteAsync(); } } catch (Exception) { //todo: additional handler? } throw; } try { using (var unitOfWork = UnitOfWorkManager.Begin()) { longRunInfo = await _longRunInfoRepo.GetAsync(longRunInfo.Id); longRunInfo.JobId = jobId; await unitOfWork.CompleteAsync(); } } catch (Exception) { //todo: additional handler? } return(new LongRunResult { LongRunId = longRunId, JobId = jobId }); }