Beispiel #1
0
        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
            });
        }