コード例 #1
0
        public QueuedJob GetNextJob(
            String identity,
            String handle,
            TenantId tenantId,
            Dictionary <String, Object> parameterOrCustomDataFilter)
        {
            if (_healthCheck != null)
            {
                _healthCheck.Pulse();
            }

            var query = Builders <QueuedJob> .Filter.And(
                Builders <QueuedJob> .Filter.Or(
                    Builders <QueuedJob> .Filter.Eq(j => j.Status, QueuedJobExecutionStatus.Idle),
                    Builders <QueuedJob> .Filter.Eq(j => j.Status, QueuedJobExecutionStatus.ReQueued)
                    ),
                Builders <QueuedJob> .Filter.Lte(j => j.SchedulingTimestamp, DateTime.Now)
                );

            if (tenantId?.IsValid() == true)
            {
                query = Builders <QueuedJob> .Filter.And(query, Builders <QueuedJob> .Filter.Eq(j => j.TenantId, tenantId));
            }
            if (parameterOrCustomDataFilter?.Count > 0)
            {
                foreach (var filter in parameterOrCustomDataFilter)
                {
                    query = Builders <QueuedJob> .Filter.And(query,
                                                             Builders <QueuedJob> .Filter.Or(
                                                                 Builders <QueuedJob> .Filter.Eq("HandleCustomData." + filter.Key, filter.Value),
                                                                 Builders <QueuedJob> .Filter.Eq("Parameters." + filter.Key, filter.Value)));
                }
            }

            var documentSerializer = BsonSerializer.SerializerRegistry.GetSerializer <QueuedJob>();
            var renderedFilter     = query.Render(documentSerializer, BsonSerializer.SerializerRegistry);
            var json = renderedFilter.ToJson();

            var result = _collection.FindOneAndUpdate(
                query,
                //SortBy = SortBy<QueuedJob>.Ascending(j => j.SchedulingTimestamp),
                Builders <QueuedJob> .Update
                .Set(j => j.Status, QueuedJobExecutionStatus.Executing)
                .Set(j => j.ExecutionStartTime, null)
                .Set(j => j.ExecutingIdentity, identity)
                .Set(j => j.ExecutingHandle, handle)
                .Set(j => j.ExecutionError, null),
                new FindOneAndUpdateOptions <QueuedJob, QueuedJob>()
            {
                Sort = Builders <QueuedJob> .Sort
                       .Ascending(j => j.Status)  //idle is 0, they will get executed with priority.
                       .Ascending(j => j.SchedulingTimestamp),
                ReturnDocument = ReturnDocument.After
            });

            return(result);
        }
コード例 #2
0
 public QueuedJob GetNextJob(String identity, String handle, TenantId tenantId, Dictionary<String, Object> customData)
 {
     if (_healthCheck != null) _healthCheck.Pulse();
     var query = Builders<QueuedJob>.Filter.And(
                 Builders<QueuedJob>.Filter.Or(
                     Builders<QueuedJob>.Filter.Eq(j => j.Status, QueuedJobExecutionStatus.Idle),
                     Builders<QueuedJob>.Filter.Eq(j => j.Status, QueuedJobExecutionStatus.ReQueued)
                 ),
                 Builders<QueuedJob>.Filter.Lte(j => j.SchedulingTimestamp, DateTime.Now)
         ); 
     if (tenantId != null && tenantId.IsValid()) 
     {
         query = Builders<QueuedJob>.Filter.And(query, Builders<QueuedJob>.Filter.Eq(j => j.TenantId, tenantId));
     }
     if (customData != null && customData.Count > 0) 
     {
         foreach (var filter in customData)
         {
             query = Builders<QueuedJob>.Filter.And(query, Builders<QueuedJob>.Filter.Eq("HandleCustomData." + filter.Key, BsonValue.Create( filter.Value)));
         }
     }
     var result = _collection.FindOneAndUpdate(
         query,
          //SortBy = SortBy<QueuedJob>.Ascending(j => j.SchedulingTimestamp),
          Builders<QueuedJob>.Update
             .Set(j => j.Status, QueuedJobExecutionStatus.Executing)
             .Set(j => j.ExecutionStartTime, DateTime.Now)
             .Set(j => j.ExecutingIdentity, identity)
             .Set(j => j.ExecutingHandle, handle)
             .Set(j => j.ExecutionError, null),
          new FindOneAndUpdateOptions<QueuedJob, QueuedJob>() {
              Sort = Builders<QueuedJob>.Sort.Ascending(j => j.SchedulingTimestamp),
              ReturnDocument = ReturnDocument.After
          });
     if (result != null)
     {
         return result;
     }
     return null;
     throw new ApplicationException("Error in Finding next job.");
 }