public static void FailUid(WorkQueueUid sop, bool retry) { using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { IWorkQueueUidEntityBroker uidUpdateBroker = updateContext.GetBroker<IWorkQueueUidEntityBroker>(); WorkQueueUidUpdateColumns columns = new WorkQueueUidUpdateColumns(); if (!retry) columns.Failed = true; else { if (sop.FailureCount >= ImageServerCommonConfiguration.WorkQueueMaxFailureCount) { columns.Failed = true; } else { columns.FailureCount = ++sop.FailureCount; } } uidUpdateBroker.Update(sop.GetKey(), columns); updateContext.Commit(); } }
/// <summary> /// Update an entry in the <see cref="WorkQueueUid"/> table. /// </summary> /// <remarks> /// Note that just the Duplicate, Failed, FailureCount, and Extension columns are updated from the /// input parameter <paramref name="sop"/>. /// </remarks> /// <param name="sop">The <see cref="WorkQueueUid"/> entry to update.</param> protected virtual void UpdateWorkQueueUid(WorkQueueUid sop) { DBUpdateTime.Add( TimeSpanStatisticsHelper.Measure( delegate { using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { IWorkQueueUidEntityBroker update = updateContext.GetBroker<IWorkQueueUidEntityBroker>(); WorkQueueUidUpdateColumns columns = new WorkQueueUidUpdateColumns { Duplicate = sop.Duplicate, Failed = sop.Failed, FailureCount = sop.FailureCount }; if (sop.Extension != null) columns.Extension = sop.Extension; update.Update(sop.GetKey(), columns); updateContext.Commit(); } })); }
/// <summary> /// Routine for failing a work queue uid record. /// </summary> /// <param name="uid">The WorkQueueUid record to fail.</param> /// <param name="retry">A boolean value indicating whether a retry will be attempted later.</param> protected void FailWorkQueueUid(WorkQueueUid uid, bool retry) { using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { IWorkQueueUidEntityBroker uidUpdateBroker = updateContext.GetBroker<IWorkQueueUidEntityBroker>(); WorkQueueUidUpdateColumns columns = new WorkQueueUidUpdateColumns(); if (!retry) columns.Failed = true; else { if (uid.FailureCount >= ImageServerCommonConfiguration.WorkQueueMaxFailureCount) { columns.Failed = true; } else { columns.FailureCount = ++uid.FailureCount; } } if (uidUpdateBroker.Update(uid.GetKey(), columns)) updateContext.Commit(); else throw new ApplicationException(String.Format("FailUid(): Unable to update work queue uid {0}", uid.Key)); } }
/// <summary> /// Delete an entry in the <see cref="WorkQueueUid"/> table. /// </summary> /// <param name="sop">The <see cref="WorkQueueUid"/> entry to delete.</param> protected virtual void DeleteWorkQueueUid(WorkQueueUid sop) { // Must retry in case of db error. // Failure to do so may lead to orphaned WorkQueueUid and FileNotFoundException // when the work queue is reset. int retryCount = 0; while (true) { try { TimeSpanStatistics time = TimeSpanStatisticsHelper.Measure( delegate { using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { IWorkQueueUidEntityBroker delete = updateContext.GetBroker<IWorkQueueUidEntityBroker>(); delete.Delete(sop.GetKey()); updateContext.Commit(); } }); DBUpdateTime.Add(time); break; // done } catch (Exception ex) { if (ex is PersistenceException || ex is SqlException) { if (retryCount > MAX_DB_RETRY) { Platform.Log(LogLevel.Error, ex, "Error occurred when calling DeleteWorkQueueUid. Max db retry count has been reached."); WorkQueueItem.FailureDescription = String.Format("Error occurred when calling DeleteWorkQueueUid. Max db retry count has been reached."); PostProcessingFailure(WorkQueueItem, WorkQueueProcessorFailureType.Fatal); return; } Platform.Log(LogLevel.Error, ex, "Error occurred when calling DeleteWorkQueueUid(). Retry later. SOPUID={0}", sop.SopInstanceUid); SleepForRetry(); // Service is stoping if (CancelPending) { Platform.Log(LogLevel.Warn, "Termination Requested. DeleteWorkQueueUid() is now terminated."); break; } retryCount++; } else throw; } } }