コード例 #1
0
        /// <summary>
        /// Create query
        /// </summary>
        /// <param name="query"></param>
        /// <param name="queryParameters"></param>
        /// <returns></returns>
        private static string CreateQuery(JobInfoQueryModel query,
                                          out Dictionary <string, object> queryParameters)
        {
            queryParameters = new Dictionary <string, object>();
            var queryString = $"SELECT * FROM r WHERE ";

            if (query?.Status != null)
            {
                queryString +=
                    $"r.{nameof(JobDocument.Status)} = @state AND ";
                queryParameters.Add("@state", query.Status.Value);
            }
            if (query?.Name != null)
            {
                queryString +=
                    $"r.{nameof(JobDocument.Name)} = @name AND ";
                queryParameters.Add("@name", query.Name);
            }
            if (query?.JobConfigurationType != null)
            {
                queryString +=
                    $"r.{nameof(JobDocument.Type)} = @type AND ";
                queryParameters.Add("@type", query.JobConfigurationType);
            }
            queryString +=
                $"r.{nameof(JobDocument.ClassType)} = '{JobDocument.ClassTypeName}'";
            return(queryString);
        }
コード例 #2
0
        /// <inheritdoc/>
        public async Task <JobInfoListModel> QueryJobsAsync(JobInfoQueryModel query,
                                                            int?maxResults, CancellationToken ct)
        {
            var request = query.Map <JobInfoQueryApiModel>();
            var result  = await _client.QueryJobsAsync(request, maxResults, ct);

            return(result.Map <JobInfoListModel>());
        }
コード例 #3
0
        /// <inheritdoc/>
        public async Task <JobProcessingInstructionModel> GetAvailableJobAsync(string workerId,
                                                                               JobRequestModel request, CancellationToken ct)
        {
            var query = new JobInfoQueryModel {
                Status = JobStatus.Active // Only query active jobs
            };
            string continuationToken = null;

            do
            {
                var jobList = await _jobRepository.QueryAsync(query, continuationToken, null, ct);

                if (jobList?.Jobs == null)
                {
                    break;
                }
                System.Diagnostics.Debug
                .Assert(!jobList.Jobs.Any(j => j.LifetimeData.Status != JobStatus.Active));

                // Filter demands
                var demandFilteredJobs = jobList.Jobs
                                         .Where(j => _demandMatcher.MatchCapabilitiesAndDemands(j.Demands,
                                                                                                request?.Capabilities))
                                         .ToArray();

                foreach (var job in demandFilteredJobs)
                {
                    // Test the listed job first before hitting the database
                    var jobProcessInstruction = CalculateInstructions(job, workerId);
                    if (jobProcessInstruction != null)
                    {
                        try {
                            await _jobRepository.UpdateAsync(job.Id, existingJob => {
                                // Try again on the current value in the database
                                jobProcessInstruction = CalculateInstructions(existingJob, workerId);
                                if (jobProcessInstruction != null)
                                {
                                    _jobEventHandler.OnJobAssignmentAsync(_jobService, jobProcessInstruction.Job, workerId).Wait();
                                }
                                return(Task.FromResult(jobProcessInstruction != null));
                            }, ct);

                            return(jobProcessInstruction);
                        }
                        catch (ResourceNotFoundException) {
                            continue; // Job deleted while updating, continue to next job
                        }
                    }
                }
                continuationToken = jobList.ContinuationToken;
            }while (continuationToken != null);
            return(null);
        }
コード例 #4
0
        /// <inheritdoc/>
        public async Task <JobInfoListModel> QueryAsync(JobInfoQueryModel query,
                                                        string continuationToken, int?maxResults, CancellationToken ct)
        {
            var client  = _documents.OpenSqlClient();
            var results = continuationToken != null?
                          client.Continue <JobDocument>(continuationToken, maxResults) :
                              client.Query <JobDocument>(CreateQuery(query, out var queryParameters),
                                                         queryParameters, maxResults);

            if (!results.HasMore())
            {
                return(new JobInfoListModel());
            }
            var documents = await results.ReadAsync(ct);

            return(new JobInfoListModel {
                ContinuationToken = results.ContinuationToken,
                Jobs = documents.Select(r => r.Value.ToFrameworkModel()).ToList()
            });
        }
コード例 #5
0
        /// <inheritdoc/>
        public async Task <JobInfoListModel> QueryAsync(JobInfoQueryModel query,
                                                        string continuationToken, int?maxResults, CancellationToken ct)
        {
            await _lock.WaitAsync();

            try {
                var jobs = _jobs.Select(j => j.Clone()).ToList();
                if (query != null)
                {
                    // TODO
                    throw new NotImplementedException();
                }
                return(new JobInfoListModel {
                    Jobs = jobs
                });
            }
            finally {
                _lock.Release();
            }
        }
コード例 #6
0
 /// <inheritdoc/>
 public async Task <JobInfoListModel> QueryJobsAsync(JobInfoQueryModel query,
                                                     int?maxResults, CancellationToken ct)
 {
     return(await _jobRepository.QueryAsync(query, null, maxResults, ct));
 }