/// <summary> /// Writes all messages currently in the queue to MongoDb and acknowledges /// </summary> protected override void ProcessQueue() { // Will happen when ProcessQueue is called due to the timer, before we receive our first message if (Model == null) { return; } lock (LockObj) { if (ToProcess.Count == 0) { return; } Logger.Info($"Queue contains {ToProcess.Count} message to write"); foreach ((string modality, List <BsonDocument> modalityDocs) in MongoModalityGroups.GetModalityChunks(ToProcess.Select(x => x.Item1).ToList())) { Logger.Debug($"Attempting to write {modalityDocs.Count} documents of modality {modality}"); while (FailedWriteAttempts < FailedWriteLimit) { WriteResult imageWriteResult = MongoDbAdapter.WriteMany(modalityDocs, modality); if (imageWriteResult == WriteResult.Success) { Logger.Debug($"Wrote {modalityDocs.Count} documents successfully, sending ACKs"); // Hopefully this uses ReferenceEquals, otherwise will be slow... foreach (ulong deliveryTag in ToProcess .Where(x => modalityDocs.Contains(x.Item1)) .Select(x => x.Item2)) { Model.BasicAck(deliveryTag, false); } AckCount += modalityDocs.Count; FailedWriteAttempts = 0; break; } Logger.Warn($"Failed to write {FailedWriteAttempts + 1} time(s) in a row"); if (++FailedWriteAttempts < FailedWriteLimit) { continue; } throw new ApplicationException("Failed write attempts exceeded"); } } Logger.Debug("Wrote and acknowledged all documents in queue. Clearing and continutig"); ToProcess.Clear(); } }
public void ImageProcessor_ModalitySplit_NonstandardModalities() { var docs = new List <BsonDocument> { // MR group new BsonDocument { { "tag", "value" }, { "Modality", "MR" } }, new BsonDocument { { "tag", "value" }, { "Modality", "MR" } }, // CT group new BsonDocument { { "tag", "value" }, { "Modality", "CT" } }, new BsonDocument { { "tag", "value" }, { "Modality", "CT" } }, new BsonDocument { { "tag", "value" }, { "Modality", "CT" } }, // Other group new BsonDocument { { "tag", "value" }, { "Modality", BsonNull.Value } }, new BsonDocument { { "tag", "value" }, { "Modality", "*" } }, new BsonDocument { { "tag", "value" }, { "Modality", "OTHER" } }, new BsonDocument { { "tag", "value" } } }; List <Tuple <string, List <BsonDocument> > > grouped = MongoModalityGroups.GetModalityChunks(docs).ToList(); Assert.AreEqual(3, grouped.Count, "Expected 3 groupings"); Assert.AreEqual("MR", grouped[0].Item1, "Expected MR group"); Assert.AreEqual(2, grouped[0].Item2.Count, "Expected 2 in MR group"); Assert.AreEqual("CT", grouped[1].Item1, "Expected CT group"); Assert.AreEqual(3, grouped[1].Item2.Count, "Expected 3 in CT group"); Assert.AreEqual("OTHER", grouped[2].Item1, "Expected OTHER group"); Assert.AreEqual(4, grouped[2].Item2.Count, "Expected 4 in OTHER group"); }
public void ImageProcessor_ModalitySplit_StandardModalities() { List <BsonDocument> docs = MongoModalityGroups.MajorModalities .Take(4) .Select(x => new BsonDocument { { "tag", "value" }, { "Modality", x } }) .ToList(); List <Tuple <string, List <BsonDocument> > > grouped = MongoModalityGroups.GetModalityChunks(docs).ToList(); Assert.AreEqual(4, grouped.Count); foreach (Tuple <string, List <BsonDocument> > thing in grouped) { Assert.AreEqual(1, thing.Item2.Count); } }