Exemple #1
0
        public async Task AddRecurrentJob(JobDb job)
        {
            var collection = _mongoClientProvider.GetCollection <JobMongoModel>();

            var update = Builders <JobMongoModel> .Update
                         .Set(x => x.Cron, job.Cron)
                         .Set(x => x.StartAt, job.StartAt);

            var needsProperties =
                _jobDbProperties.Where(x => x.Name != nameof(JobMongoModel.Cron) &&
                                       x.Name != nameof(JobMongoModel.StartAt));

            //Если джоб уже существет апдейтем только 2 поля
            //Если нужно создать, то устанавливаем все остальные поля
            foreach (var jobDbProperty in needsProperties)
            {
                update = update.SetOnInsert(jobDbProperty.Name, jobDbProperty.GetValue(job));
            }

            await IMongoCollectionExtensions.UpdateOneAsync(collection, x => x.JobKey == job.JobKey &&
                                                            (x.Status == JobStatus.Executing || x.Status == JobStatus.Ready),
                                                            update,
                                                            new UpdateOptions
            {
                IsUpsert = true
            });
        }
Exemple #2
0
        public void CreateJobMongoModel_AllFieldsSuccessMap()
        {
            var jobDb = new JobDb
            {
                JobType      = "Horarium.TestJob, Horarium",
                JobParamType = "System.Int32, System.Private.CoreLib",
                JobParam     = "437",
                Status       = JobStatus.Ready,
                CountStarted = 0,
                NextJob      = null,
                Cron         = "* * * * * *",
                Delay        = TimeSpan.FromSeconds(5)
            };

            var jobMongoModel = JobMongoModel.CreateJobMongoModel(jobDb);

            Assert.Equal("Horarium.TestJob, Horarium", jobMongoModel.JobType);
            Assert.Equal("System.Int32, System.Private.CoreLib", jobMongoModel.JobParamType);
            Assert.Equal("437", jobMongoModel.JobParam);
            Assert.Equal(JobStatus.Ready, jobMongoModel.Status);
            Assert.Equal(0, jobMongoModel.CountStarted);
            Assert.Null(jobMongoModel.NextJob);
            Assert.Equal("* * * * * *", jobMongoModel.Cron);
            Assert.Equal(TimeSpan.FromSeconds(5), jobMongoModel.Delay);
        }
Exemple #3
0
        public void Add(JobDb job)
        {
            if (job.Status != JobStatus.RepeatJob)
            {
                return;
            }

            _startAtIndex.Add(job);
        }
Exemple #4
0
        public void Add(JobDb job)
        {
            if (job.Status != JobStatus.Failed)
            {
                return;
            }

            _index.Add(job.JobId, job);
        }
Exemple #5
0
        // GET: Profiles/Create
        public ActionResult Create()
        {
            ProfileMoviesJobsViewModel model = new ProfileMoviesJobsViewModel
            {
                AllMovies = MovieDb.GetAllMovies(db),
                AllJobs   = JobDb.GetAllJobs(db)
            };

            return(View(model));
        }
Exemple #6
0
        public void Add(JobDb job)
        {
            if (job.Status != JobStatus.Executing)
            {
                return;
            }

            _startedExecutingIndex.Add(job);
            _jobKeyIndex.Add(job);
        }
Exemple #7
0
        public void Add(JobDb job)
        {
            if (job.Status != JobStatus.Ready)
            {
                return;
            }

            _startAtIndex.Add(job);
            _jobKeyIndex.Add(job);
        }
Exemple #8
0
        public async Task <JobDb> RemoveJob(JobDb job)
        {
            var jobToRemove = await _context.Jobs.FirstAsync(u => u.Id == job.Id);

            _context.Jobs.Attach(jobToRemove);
            _context.Remove(jobToRemove);
            await _context.SaveChangesAsync();

            return(job);
        }
Exemple #9
0
        public static async Task <bool> Schedule(Expression <Action> action, DateTime scheduledTime, string name)
        {
            var job = new JobDb {
                Name = name,
            };

            job.Action = ExpressionHelper.ToString(action);
            job.StateUpdates.Add(new StateUpdate(JobState.SCHEDULED, ""));
            await _jobContext.GetCollection().InsertOneAsync(job);

            return(true);
        }
Exemple #10
0
        public void Remove(JobDb job)
        {
            if (string.IsNullOrEmpty(job.JobKey))
            {
                return;
            }

            if (!_index.TryGetValue(job.JobKey, out var set))
            {
                return;
            }

            set.Remove(job);
        }
Exemple #11
0
        public void ToJob()
        {
            var job = new JobDb
            {
                JobType      = _strJobType,
                JobParamType = _strJobParamType,
                JobParam     = _strJobParam
            };

            var jobDb = job.ToJob(new JsonSerializerSettings());

            Assert.Equal(typeof(TestJob), jobDb.JobType);
            Assert.Equal("test", jobDb.JobParam);
        }
        public Task AddRecurrentJob(JobDb job)
        {
            return(_processor.Execute(() =>
            {
                var foundJob = _storage.FindRecurrentJobToUpdate(job.JobKey) ?? job.Copy();

                _storage.Remove(foundJob);

                foundJob.Cron = job.Cron;
                foundJob.StartAt = job.StartAt;

                _storage.Add(foundJob);
            }));
        }
Exemple #13
0
        public void ToJobDb()
        {
            var job = new JobMetadata()
            {
                JobType  = typeof(TestJob),
                JobParam = "test"
            };

            var jobDb = JobDb.CreatedJobDb(job, new JsonSerializerSettings());

            Assert.Equal(jobDb.JobType, _strJobType);
            Assert.Equal(jobDb.JobParamType, _strJobParamType);
            Assert.Equal(jobDb.JobParam, _strJobParam);
        }
Exemple #14
0
        public async Task <JobDb> AddJob(JobDb job)
        {
            job.Id = 0;
            var newJob = new JobDb {
                Id            = 0,
                Name          = job.Name,
                UserId        = job.UserId,
                ClientId      = job.ClientId,
                HoursReported = job.HoursReported
            };
            await _context.Jobs.AddAsync(newJob);

            await _context.SaveChangesAsync();

            return(job);
        }
        public override async Task <bool> DoWork()
        {
            JobDb job = null;

            while (_cancelToken.IsCancellationRequested == false)
            {
                long processScore = (DateTime.UtcNow - TimeSpan.FromSeconds(60)).Ticks;
                var  filter       = Builders <JobDb> .Filter.Eq(_ => _.State, JobState.PROCESSING) &
                                    Builders <JobDb> .Filter.Eq(_ => _.IsLocked, true) &
                                    Builders <JobDb> .Filter.Lte(_ => _.ProcessScore, processScore);

                var updateDefinition = Builders <JobDb> .Update.Set(_ => _.IsLocked, false)
                                       .Set(_ => _.LastFetchedTime, processScore).Set(_ => _.State, JobState.FAILED)
                                       .AddToSet(_ => _.StateUpdates, new StateUpdate(JobState.PROCESSING));

                try
                {
                    job = await _jobContext.GetCollection().FindOneAndUpdateAsync(filter, updateDefinition);

                    if (job == null)
                    {
                        await Task.Delay(1000);

                        continue;
                    }
                    _logger.LogError($"Job({job.Id}) timed out and failed");
                }
                catch (Exception e)
                {
                    if (job != null)
                    {
                        await _jobContext.GetCollection().UpdateOneAsync(Builders <JobDb> .Filter.Eq(_ => _.Id, job.Id),
                                                                         Builders <JobDb> .Update.Set(_ => _.IsLocked, false)
                                                                         .Set(_ => _.State, JobState.FAILED)
                                                                         .AddToSet(_ => _.StateUpdates, new StateUpdate(JobState.FAILED, e.Message)));
                    }

                    _logger.LogError(e.Message);
                }

                await Task.Delay(_timeBetweenJobs);
            }

            return(true);
        }
Exemple #16
0
        private async Task ExecuteJob(JobMetadata jobMetadata)
        {
            dynamic jobImplementation = null;

            try
            {
                using (var scope = _settings.JobScopeFactory.Create())
                {
                    try
                    {
                        jobImplementation = scope.CreateJob(jobMetadata.JobType);
                    }
                    catch (Exception ex)
                    {
                        //Дополнительное логирование ошибки, когда джоб не может быть создан
                        _settings.Logger.Error($"Ошибка создания джоба {jobMetadata.JobType}", ex);
                        throw;
                    }

                    _settings.Logger.Debug("got jobImplementation -" + jobImplementation.GetType());
                    _settings.Logger.Debug("got JobParam -" + jobMetadata.JobParam.GetType());
                    await jobImplementation.Execute((dynamic)jobMetadata.JobParam);

                    _settings.Logger.Debug("jobMetadata excecuted");

                    if (jobMetadata.NextJob != null)
                    {
                        jobMetadata.NextJob.StartAt = DateTime.UtcNow + jobMetadata.NextJob.Delay.GetValueOrDefault();

                        await _jobRepository.AddJob(JobDb.CreatedJobDb(jobMetadata.NextJob,
                                                                       _settings.JsonSerializerSettings));

                        _settings.Logger.Debug("next jobMetadata added");
                    }

                    await _jobRepository.RemoveJob(jobMetadata.JobId);

                    _settings.Logger.Debug("jobMetadata saved success");
                }
            }
            catch (Exception ex)
            {
                await HandleFailed(jobMetadata, ex, jobImplementation);
            }
        }
Exemple #17
0
        public void Add(JobDb job)
        {
            if (string.IsNullOrEmpty(job.JobKey))
            {
                return;
            }

            if (!_index.TryGetValue(job.JobKey, out var set))
            {
                _index[job.JobKey] = new SortedSet <JobDb>(new JobIdComparer())
                {
                    job
                }
            }
            ;
            else
            {
                set.Add(job);
            }
        }
Exemple #18
0
        // GET: Profiles/Edit/5
        public ActionResult Edit(int?id)
        {
            if (!id.HasValue)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Profile profile = ProfileDb.FindProfile(db, id.Value);

            if (profile == null)
            {
                return(HttpNotFound());
            }

            ProfileMoviesJobsViewModel model = new ProfileMoviesJobsViewModel
            {
                Profile   = profile,
                AllMovies = MovieDb.GetAllMovies(db),
                AllJobs   = JobDb.GetAllJobs(db)
            };

            return(View(model));
        }
Exemple #19
0
 public static JobMongoModel CreateJobMongoModel(JobDb jobDb)
 {
     return(new JobMongoModel
     {
         JobId = jobDb.JobId,
         JobKey = jobDb.JobKey,
         Status = jobDb.Status,
         CountStarted = jobDb.CountStarted,
         StartedExecuting = jobDb.StartedExecuting,
         ExecutedMachine = jobDb.ExecutedMachine,
         JobType = jobDb.JobType,
         JobParam = jobDb.JobParam,
         JobParamType = jobDb.JobParamType,
         StartAt = jobDb.StartAt,
         NextJob = jobDb.NextJob != null?CreateJobMongoModel(jobDb.NextJob) : null,
                       Cron = jobDb.Cron,
                       Delay = jobDb.Delay,
                       ObsoleteInterval = jobDb.ObsoleteInterval,
                       RepeatStrategy = jobDb.RepeatStrategy,
                       MaxRepeatCount = jobDb.MaxRepeatCount
     });
 }
Exemple #20
0
 public static JobDb Copy(this JobDb source)
 {
     return(new JobDb
     {
         JobKey = source.JobKey,
         JobId = source.JobId,
         Status = source.Status,
         JobType = source.JobType,
         JobParamType = source.JobParamType,
         JobParam = source.JobParam,
         CountStarted = source.CountStarted,
         StartedExecuting = source.StartedExecuting,
         ExecutedMachine = source.ExecutedMachine,
         StartAt = source.StartAt,
         NextJob = source.NextJob?.Copy(),
         Cron = source.Cron,
         Delay = source.Delay,
         ObsoleteInterval = source.ObsoleteInterval,
         RepeatStrategy = source.RepeatStrategy,
         MaxRepeatCount = source.MaxRepeatCount
     });
 }
Exemple #21
0
 public void Remove(JobDb job)
 {
     _startAtIndex.Remove(job);
     _jobKeyIndex.Remove(job);
 }
Exemple #22
0
 public async Task AddJob(JobDb job)
 {
     var collection = _mongoClientProvider.GetCollection <JobMongoModel>();
     await collection.InsertOneAsync(JobMongoModel.CreateJobMongoModel(job));
 }
Exemple #23
0
 public void Remove(JobDb job)
 {
     _startedExecutingIndex.Remove(job);
     _jobKeyIndex.Remove(job);
 }
Exemple #24
0
        public void Remove(JobDb job)
        {
            _jobs.Remove(job.JobId);

            _indexes.ForEach(x => x.Remove(job));
        }
Exemple #25
0
 public static int Compare(JobDb x, JobDb y)
 {
     return(string.Compare(x.JobId, y.JobId, StringComparison.Ordinal));
 }
Exemple #26
0
        public async Task AddRecurrentJob(JobMetadata jobMetadata)
        {
            await _recurrentJobSettingsAdder.Add(jobMetadata.Cron, jobMetadata.JobType, jobMetadata.JobKey);

            await _jobRepository.AddRecurrentJob(JobDb.CreatedJobDb(jobMetadata, _jsonSerializerSettings));
        }
Exemple #27
0
        public Task AddEnqueueJob(JobMetadata jobMetadata)
        {
            var job = JobDb.CreatedJobDb(jobMetadata, _jsonSerializerSettings);

            return(_jobRepository.AddJob(job));
        }
 public Task AddJob(JobDb job)
 {
     return(_processor.Execute(() => _storage.Add(job.Copy())));
 }
Exemple #29
0
        public void Add(JobDb job)
        {
            _jobs.Add(job.JobId, job);

            _indexes.ForEach(x => x.Add(job));
        }
Exemple #30
0
 public void Remove(JobDb job)
 {
     _index.Remove(job.JobId);
 }