/// <summary> /// Set a status of <see cref="WorkQueue"/> item after batch processing has been completed. /// </summary> /// <remarks> /// <para> /// This routine will set the status of the <paramref name="item"/> to one of the followings /// <list type="bullet"> /// <item>Failed: if the current process failed and number of retries has been reached.</item> /// <item>Pending: if the current batch has been processed successfully</item> /// <item>Idle : if current batch size = 0.</item> /// <item>Completed: if batch size =0 (idle) and the item has expired.</item> /// </list> /// </para> /// </remarks> /// <param name="item">The <see cref="WorkQueue"/> item to set.</param> /// <param name="status">Indicates if complete.</param> /// <param name="resetQueueStudyState">Reset the queue study state back to Idle</param> protected virtual void PostProcessing(Model.WorkQueue item, WorkQueueProcessorStatus status, WorkQueueProcessorDatabaseUpdate resetQueueStudyState) { Completed = status == WorkQueueProcessorStatus.Complete || (status == WorkQueueProcessorStatus.Idle && item.ExpirationTime < Platform.Time); if (Completed) { if (WorkQueueSettings.Instance.EnableStudyIntegrityValidation) { Platform.Log(LogLevel.Info, "{0} has completed (GUID={1})", item.WorkQueueTypeEnum, item.GetKey().Key); VerifyStudy(StorageLocation); } } DBUpdateTime.Add( delegate { using ( IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { IUpdateWorkQueue update = updateContext.GetBroker<IUpdateWorkQueue>(); UpdateWorkQueueParameters parms = new UpdateWorkQueueParameters { WorkQueueKey = item.GetKey(), StudyStorageKey = item.StudyStorageKey, ProcessorID = item.ProcessorID }; DateTime now = Platform.Time; if (item.FailureDescription != null) parms.FailureDescription = item.FailureDescription; DateTime scheduledTime = now.AddSeconds(WorkQueueProperties.ProcessDelaySeconds); if (scheduledTime > item.ExpirationTime) scheduledTime = item.ExpirationTime; if (status == WorkQueueProcessorStatus.CompleteDelayDelete) { parms.WorkQueueStatusEnum = WorkQueueStatusEnum.Idle; parms.FailureCount = item.FailureCount; parms.FailureDescription = ""; parms.ScheduledTime = parms.ExpirationTime = Platform.Time.AddSeconds(WorkQueueProperties.DeleteDelaySeconds); if (resetQueueStudyState == WorkQueueProcessorDatabaseUpdate.ResetQueueState) parms.QueueStudyStateEnum = QueueStudyStateEnum.Idle; } else if (status == WorkQueueProcessorStatus.Complete || (status == WorkQueueProcessorStatus.Idle && item.ExpirationTime < Platform.Time)) { parms.WorkQueueStatusEnum = WorkQueueStatusEnum.Completed; parms.FailureCount = item.FailureCount; parms.ScheduledTime = scheduledTime; if (resetQueueStudyState == WorkQueueProcessorDatabaseUpdate.ResetQueueState) parms.QueueStudyStateEnum = QueueStudyStateEnum.Idle; parms.ExpirationTime = item.ExpirationTime; // Keep the same Completed = true; } else if (status == WorkQueueProcessorStatus.Idle || status == WorkQueueProcessorStatus.IdleNoDelete) { scheduledTime = now.AddSeconds(WorkQueueProperties.DeleteDelaySeconds); if (scheduledTime > item.ExpirationTime) scheduledTime = item.ExpirationTime; parms.WorkQueueStatusEnum = WorkQueueStatusEnum.Idle; parms.ScheduledTime = scheduledTime; parms.ExpirationTime = item.ExpirationTime; // keep the same parms.FailureCount = item.FailureCount; } else { parms.WorkQueueStatusEnum = WorkQueueStatusEnum.Pending; parms.ExpirationTime = scheduledTime.AddSeconds(WorkQueueProperties.ExpireDelaySeconds); parms.ScheduledTime = scheduledTime; parms.FailureCount = item.FailureCount; } if (false == update.Execute(parms)) { Platform.Log(LogLevel.Error, "Unable to update {0} WorkQueue Key: {1}", item.WorkQueueTypeEnum, item.Key.ToString()); } else updateContext.Commit(); } } ); }
protected override void PostProcessing(Model.WorkQueue item, WorkQueueProcessorStatus status, WorkQueueProcessorDatabaseUpdate resetQueueStudyState) { ProcessAdditionalFiles(); base.PostProcessing(item, status, resetQueueStudyState); }