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); }
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."); }