예제 #1
0
        public async Task RecordNewJob(RecordEarningsJob earningsJobRequest, CancellationToken cancellationToken = default(CancellationToken))
        {
            logger.LogDebug($"Now recording new provider earnings job.  Job Id: {earningsJobRequest.JobId}, Ukprn: {earningsJobRequest.Ukprn}.");
            var jobDetails = new JobModel
            {
                JobType           = JobType.EarningsJob,
                StartTime         = earningsJobRequest.StartTime,
                CollectionPeriod  = earningsJobRequest.CollectionPeriod,
                AcademicYear      = earningsJobRequest.CollectionYear,
                Ukprn             = earningsJobRequest.Ukprn,
                DcJobId           = earningsJobRequest.JobId,
                IlrSubmissionTime = earningsJobRequest.IlrSubmissionTime,
                Status            = JobStatus.InProgress,
                LearnerCount      = earningsJobRequest.LearnerCount
            };
            var isNewJob = await jobStorageService.StoreNewJob(jobDetails, CancellationToken.None);

            logger.LogDebug($"Finished storing new job: {jobDetails.Id} for dc job id: {jobDetails.DcJobId}, Ukprn: {earningsJobRequest.Ukprn}. Now storing the job messages.");
            await RecordJobInProgressMessages(earningsJobRequest.JobId, earningsJobRequest.GeneratedMessages, cancellationToken).ConfigureAwait(false);

            logger.LogDebug($"Finished storing new job messages for job: {jobDetails.Id} for dc job id: {jobDetails.DcJobId}, Ukprn: {earningsJobRequest.Ukprn}.");
            if (isNewJob)
            {
                SendTelemetry(earningsJobRequest, jobDetails);
            }
            logger.LogInfo($"Finished saving the job info.  DC Job Id: {earningsJobRequest.JobId}, Ukprn: {earningsJobRequest.Ukprn}.");
        }
        public async Task Stores_New_Jobs()
        {
            var jobStarted = new RecordEarningsJob
            {
                CollectionPeriod  = 1,
                CollectionYear    = 1819,
                JobId             = 1,
                Ukprn             = 9999,
                IlrSubmissionTime = DateTime.UtcNow.AddMinutes(-20),
                StartTime         = DateTimeOffset.UtcNow,
            };

            var service = mocker.Create <EarningsJobService>();
            await service.RecordNewJob(jobStarted, default(CancellationToken));

            mocker.Mock <IJobStorageService>()
            .Verify(x => x.StoreNewJob(
                        It.Is <JobModel>(job =>
                                         job.StartTime == jobStarted.StartTime &&
                                         job.JobType == JobType.EarningsJob &&
                                         job.Status == JobStatus.InProgress && job.DcJobId == jobStarted.JobId &&
                                         job.CollectionPeriod == jobStarted.CollectionPeriod &&
                                         job.AcademicYear == jobStarted.CollectionYear &&
                                         job.IlrSubmissionTime == jobStarted.IlrSubmissionTime &&
                                         job.Ukprn == jobStarted.Ukprn), It.IsAny <CancellationToken>()), Times.Once);
        }
예제 #3
0
 private void SendTelemetry(RecordEarningsJob startedEvent, JobModel jobDetails)
 {
     telemetry.TrackEvent("Started Job",
                          new Dictionary <string, string>
     {
         { "JobType", JobType.EarningsJob.ToString("G") },
         { "Ukprn", startedEvent.Ukprn.ToString() },
         { "Id", jobDetails.Id.ToString() },
         { "ExternalJobId", startedEvent.JobId.ToString() },
         { "CollectionPeriod", startedEvent.CollectionPeriod.ToString() },
         { "CollectionYear", startedEvent.CollectionYear.ToString() }
     },
                          new Dictionary <string, double> {
         { "LearnerCount", startedEvent.LearnerCount }
     }
                          );
 }
        public async Task StartJob(long jobId, long ukprn, DateTime ilrSubmissionTime, short collectionYear, byte collectionPeriod, List <GeneratedMessage> generatedMessages, DateTimeOffset startTime)
        {
            logger.LogVerbose($"Sending request to record start of earnings job. Job Id: {jobId}, Ukprn: {ukprn}");
            try
            {
                var batchSize = 1000; //TODO: this should come from config
                List <GeneratedMessage> batch;
                var providerEarningsEvent = new RecordEarningsJob
                {
                    StartTime         = startTime,
                    JobId             = jobId,
                    Ukprn             = ukprn,
                    IlrSubmissionTime = ilrSubmissionTime,
                    CollectionYear    = collectionYear,
                    CollectionPeriod  = collectionPeriod,
                    GeneratedMessages = generatedMessages.Take(batchSize).ToList(),
                    LearnerCount      = generatedMessages.Count
                };

                var jobsEndpointName        = config.GetSettingOrDefault("Monitoring_JobsService_EndpointName", "sfa-das-payments-monitoring-jobs");
                var partitionedEndpointName = $"{jobsEndpointName}{partitionName.PartitionNameForJob(jobId, ukprn)}";
                logger.LogVerbose($"Endpoint for RecordEarningsJob for Job Id {jobId} is `{partitionedEndpointName}`");
                await messageSession.Send(partitionedEndpointName, providerEarningsEvent).ConfigureAwait(false);

                var skip = batchSize;

                while ((batch = generatedMessages.Skip(skip).Take(1000).ToList()).Count > 0)
                {
                    skip += batchSize;
                    var providerEarningsAdditionalMessages = new RecordEarningsJobAdditionalMessages
                    {
                        JobId             = jobId,
                        GeneratedMessages = batch,
                    };
                    await messageSession.Send(partitionedEndpointName, providerEarningsAdditionalMessages).ConfigureAwait(false);
                }
                logger.LogDebug($"Sent request(s) to record start of earnings job. Job Id: {jobId}, Ukprn: {ukprn}");
            }
            catch (Exception ex)
            {
                logger.LogError($"Failed to send the request to record the earnings job. Job: {jobId}, Error: {ex.Message}", ex);
                throw;
            }
        }
        public async Task RecordNewJob(RecordEarningsJob earningsJobRequest, CancellationToken cancellationToken)
        {
            Logger.LogDebug($"Now recording new provider earnings job.  Job Id: {earningsJobRequest.JobId}, Ukprn: {earningsJobRequest.Ukprn}.");
            var jobDetails = new JobModel
            {
                JobType           = JobType.EarningsJob,
                StartTime         = earningsJobRequest.StartTime,
                CollectionPeriod  = earningsJobRequest.CollectionPeriod,
                AcademicYear      = earningsJobRequest.CollectionYear,
                Ukprn             = earningsJobRequest.Ukprn,
                DcJobId           = earningsJobRequest.JobId,
                IlrSubmissionTime = earningsJobRequest.IlrSubmissionTime,
                Status            = JobStatus.InProgress,
                LearnerCount      = earningsJobRequest.LearnerCount
            };

            await RecordNewJob(jobDetails, earningsJobRequest.GeneratedMessages, cancellationToken)
            .ConfigureAwait(false);
        }
        public async Task RecordEarningsJob(RecordEarningsJob message, CancellationToken cancellationToken)
        {
            try
            {
                using (var operation = telemetry.StartOperation("JobsService.RecordEarningsJob", message.CommandId.ToString()))
                {
                    var stopwatch = Stopwatch.StartNew();
                    var service   = lifetimeScope.Resolve <IEarningsJobService>();
                    await service.JobStarted(message, CancellationToken.None).ConfigureAwait(false);

                    telemetry.TrackDuration("JobsService.RecordEarningsJob", stopwatch.Elapsed);
                    telemetry.StopOperation(operation);
                }
            }
            catch (Exception e)
            {
                logger.LogWarning($"Error recording earning job. Job: {message.JobId}, ukprn: {message.Ukprn}, Error: {e.Message}. {e}");
                throw;
            }
        }
        public async Task Stores_In_Progress_Messages()
        {
            var generatedMessageA = new GeneratedMessage
            {
                StartTime   = DateTimeOffset.UtcNow,
                MessageId   = Guid.NewGuid(),
                MessageName = "MessageA",
            };
            var generatedMessageB = new GeneratedMessage
            {
                StartTime   = DateTimeOffset.UtcNow,
                MessageId   = Guid.NewGuid(),
                MessageName = "MessageB",
            };
            var jobStarted = new RecordEarningsJob
            {
                CollectionPeriod  = 1,
                CollectionYear    = 1819,
                JobId             = 1,
                Ukprn             = 9999,
                IlrSubmissionTime = DateTime.UtcNow.AddMinutes(-20),
                StartTime         = DateTimeOffset.UtcNow,
                GeneratedMessages = new List <GeneratedMessage> {
                    generatedMessageA, generatedMessageB
                }
            };

            var service = mocker.Create <EarningsJobService>();
            await service.RecordNewJob(jobStarted, default(CancellationToken));

            mocker.Mock <IJobStorageService>()
            .Verify(x => x.StoreInProgressMessages(It.Is <long>(jobId => jobId == jobStarted.JobId), It.Is <List <InProgressMessage> >(identifiers =>
                                                                                                                                       identifiers.Count == 2 &&
                                                                                                                                       identifiers.Exists(inProgress => inProgress.MessageId == generatedMessageA.MessageId) &&
                                                                                                                                       identifiers.Exists(inProgress => inProgress.MessageId == generatedMessageB.MessageId)), It.IsAny <CancellationToken>()), Times.Once);
        }