Example #1
0
        /// <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();
            }
        }
Example #2
0
        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");
        }
Example #3
0
        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);
            }
        }