public SendOperationInfo(WorkItemData reference, ushort messageId, byte presentationId, ClearCanvas.Dicom.Network.DicomServer server) { PresentationId = presentationId; Server = server; WorkItemData = reference; MessageId = messageId; SubOperations = 0; Complete = false; FailedSopInstanceUids = new List<string>(); }
public void Test_add_deleted_item() { var items = new ItemCollection<ActivityMonitorComponent.WorkItem>(); Assert.AreEqual(0, items.Count); var data = new WorkItemData { Identifier = 1, Status = WorkItemStatusEnum.Deleted}; var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {}); manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison); Assert.AreEqual(0, items.Count); }
public void Test_add_new_item_filtered() { var items = new ItemCollection<ActivityMonitorComponent.WorkItem>(); Assert.AreEqual(0, items.Count); var data = new WorkItemData { Identifier = 1, Priority = WorkItemPriorityEnum.Stat }; var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NormalPriorityFilter, () => { }); manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison); // item not added because of filter Assert.AreEqual(0, items.Count); }
public void Test_add_new_item() { var items = new ItemCollection<ActivityMonitorComponent.WorkItem>(); Assert.AreEqual(0, items.Count); var data = new WorkItemData {Identifier = 1}; var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {}); manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison); Assert.AreEqual(1, items.Count); Assert.IsTrue(items.Any(item => item.Id == 1)); }
private SendOperationInfo GetSendOperationInfo(WorkItemData reference) { lock (_syncLock) { return CollectionUtils.SelectFirst(_sendOperations, info => info.WorkItemData.Identifier == reference.Identifier); } }
private void UpdateProgress(WorkItemData workItem) { try { SendOperationInfo sendOperationInfo = GetSendOperationInfo(workItem); if (sendOperationInfo == null) { return; } sendOperationInfo.WorkItemData = workItem; var progress = GetProgressByMessageId(sendOperationInfo.MessageId); var msg = new DicomMessage(); DicomStatus status; if (workItem.Status == WorkItemStatusEnum.Failed) { sendOperationInfo.Complete = true; } else if (progress.RemainingSubOperations == 0 && workItem.Status != WorkItemStatusEnum.Pending) { sendOperationInfo.Complete = true; } if (SendOperationsComplete(sendOperationInfo.MessageId)) { status = DicomStatuses.Success; foreach (SendOperationInfo info in GetSendOperationInfo(sendOperationInfo.MessageId)) { foreach (string sopInstanceUid in info.FailedSopInstanceUids) msg.DataSet[DicomTags.FailedSopInstanceUidList].AppendString(sopInstanceUid); if (workItem.Status == WorkItemStatusEnum.Canceled) status = DicomStatuses.Cancel; else if (workItem.Status == WorkItemStatusEnum.Failed) status = DicomStatuses.QueryRetrieveUnableToProcess; else if (progress.FailureSubOperations > 0 && status == DicomStatuses.Success) status = DicomStatuses.QueryRetrieveSubOpsOneOrMoreFailures; } } else { status = DicomStatuses.Pending; if ((progress.RemainingSubOperations%5) != 0) return; // Only send a RSP every 5 to reduce network load } if (sendOperationInfo.Server.NetworkActive) { sendOperationInfo.Server.SendCMoveResponse(sendOperationInfo.PresentationId, sendOperationInfo.MessageId, msg, status, (ushort) progress.SuccessSubOperations, (ushort) progress.RemainingSubOperations, (ushort) progress.FailureSubOperations, (ushort) progress.WarningSubOperations); } if (status != DicomStatuses.Pending || !sendOperationInfo.Server.NetworkActive) { foreach (SendOperationInfo info in GetSendOperationInfo(sendOperationInfo.MessageId)) { RemoveSendOperationInfo(info); } } } catch (Exception e) { Platform.Log(LogLevel.Error, e, "Unexpected error processing C-MOVE Responses"); } }
private static bool IsNonTerminalStudyUpdateItem(WorkItemData item) { if (item.Request.ConcurrencyType != WorkItemConcurrency.StudyUpdate) return false; switch (item.Status) { case WorkItemStatusEnum.Pending: case WorkItemStatusEnum.InProgress: case WorkItemStatusEnum.Idle: return true; default: return false; } }
public static void PublishWorkItemChanged(WorkItemsChangedEventType eventType, WorkItemData workItem) { PublishWorkItemsChanged(eventType, new List<WorkItemData> { workItem }); }
public void Test_update_item() { var items = new ItemCollection<ActivityMonitorComponent.WorkItem> { new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1, Priority = WorkItemPriorityEnum.Normal }) }; Assert.AreEqual(1, items.Count); Assert.AreEqual(1, items[0].Id); Assert.AreEqual(WorkItemPriorityEnum.Normal, items[0].Priority); var data = new WorkItemData { Identifier = 1, Priority = WorkItemPriorityEnum.Stat }; var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {}); manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison); Assert.AreEqual(1, items.Count); Assert.AreEqual(1, items[0].Id); Assert.AreEqual(WorkItemPriorityEnum.Stat, items[0].Priority); }
public void Test_failed_item_tracking_ignores_filter() { var items = new ItemCollection<ActivityMonitorComponent.WorkItem> { new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1 }) }; Assert.AreEqual(1, items.Count); var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NormalPriorityFilter, () => { }); // add a failed item that does not meet the filter criteria var failedItem = new WorkItemData { Identifier = 2, Status = WorkItemStatusEnum.Failed, Priority = WorkItemPriorityEnum.Stat}; manager.Update(new[] { new ActivityMonitorComponent.WorkItem(failedItem) }, NopComparison); // verify that the item is not added to the collection, but is tracked as a failed item Assert.AreEqual(1, items.Count); Assert.AreEqual(1, items[0].Id); Assert.AreEqual(1, manager.FailedItemCount); }
public void Test_failed_item_tracking() { var items = new ItemCollection<ActivityMonitorComponent.WorkItem> { new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1 }) }; Assert.AreEqual(1, items.Count); var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {}); // add a failed item var failedItem = new WorkItemData { Identifier = 2, Status = WorkItemStatusEnum.Failed }; manager.Update(new[] { new ActivityMonitorComponent.WorkItem(failedItem) }, NopComparison); Assert.AreEqual(2, items.Count); Assert.AreEqual(1, manager.FailedItemCount); // add another failed item failedItem = new WorkItemData { Identifier = 3, Status = WorkItemStatusEnum.Failed }; manager.Update(new[] { new ActivityMonitorComponent.WorkItem(failedItem) }, NopComparison); Assert.AreEqual(3, items.Count); Assert.AreEqual(2, manager.FailedItemCount); // update one of the items to Pending (e.g. retry) var item = new WorkItemData { Identifier = 2, Status = WorkItemStatusEnum.Pending }; manager.Update(new[] { new ActivityMonitorComponent.WorkItem(item) }, NopComparison); Assert.AreEqual(3, items.Count); Assert.AreEqual(1, manager.FailedItemCount); // update other item to Pending (e.g. retry) item = new WorkItemData { Identifier = 3, Status = WorkItemStatusEnum.Pending }; manager.Update(new[] { new ActivityMonitorComponent.WorkItem(item) }, NopComparison); Assert.AreEqual(3, items.Count); Assert.AreEqual(0, manager.FailedItemCount); // update an item to failed item = new WorkItemData { Identifier = 1, Status = WorkItemStatusEnum.Failed }; manager.Update(new[] { new ActivityMonitorComponent.WorkItem(item) }, NopComparison); Assert.AreEqual(3, items.Count); Assert.AreEqual(1, manager.FailedItemCount); }
public void Test_clear_items() { var items = new ItemCollection<ActivityMonitorComponent.WorkItem> { new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1 }) }; Assert.AreEqual(1, items.Count); var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {}); // add a failed item var failedItem = new WorkItemData { Identifier = 2, Status = WorkItemStatusEnum.Failed }; manager.Update(new[] { new ActivityMonitorComponent.WorkItem(failedItem) }, NopComparison); Assert.AreEqual(2, items.Count); Assert.AreEqual(1, manager.FailedItemCount); manager.Clear(); // items collection is cleared Assert.AreEqual(0, items.Count); // failed item count is cleared Assert.AreEqual(0, manager.FailedItemCount); }
public void Test_update_item_delete() { var items = new ItemCollection<ActivityMonitorComponent.WorkItem> { new ActivityMonitorComponent.WorkItem(new WorkItemData { Identifier = 1, Status = WorkItemStatusEnum.Complete }) }; Assert.AreEqual(1, items.Count); Assert.AreEqual(1, items[0].Id); Assert.AreEqual(WorkItemStatusEnum.Complete, items[0].Status); var data = new WorkItemData { Identifier = 1, Status = WorkItemStatusEnum.Deleted}; var manager = new ActivityMonitorComponent.WorkItemUpdateManager(items, NoFilter, () => {}); manager.Update(new[] { new ActivityMonitorComponent.WorkItem(data) }, NopComparison); // item removed from collection, because of deleted status Assert.AreEqual(0, items.Count); }
/// <summary> /// Publishes changing work item activity to the <see cref="IWorkItemActivityMonitorService"/>. /// </summary> /// <param name="item">The work item data</param> public void PublishWorkItemActivity(WorkItemData item) { if (_activityMonitorService == null) _activityMonitorService = Platform.GetService<IWorkItemActivityMonitorService>(); _activityMonitorService.Publish(new WorkItemPublishRequest {Item = item}); }