public void SameThreadSubscriptionTest() { var manager = new TransportManager( new TransportResolver(new Dictionary <string, TransportInfo> { { "transport-1", new TransportInfo("transport-1", "login1", "pwd1", "None", "InMemory") } })); var processingGroup = manager.GetProcessingGroup("transport-1", "pg"); var usedThreads = new List <int>(); var subscription = processingGroup.Subscribe("queue", (message, action) => { lock (usedThreads) { usedThreads.Add(Thread.CurrentThread.ManagedThreadId); Console.WriteLine(Thread.CurrentThread.Name + Thread.CurrentThread.ManagedThreadId); } Thread.Sleep(50); }, null, 0); Enumerable.Range(1, 20).ForEach(i => processingGroup.Send("queue", new BinaryMessage(), 0)); Thread.Sleep(1200); Assert.That(usedThreads.Count(), Is.EqualTo(20), "not all messages were processed"); Assert.That(usedThreads.Distinct().Count(), Is.EqualTo(1), "more then one thread was used for message processing"); }
public void MultiThreadPrioritizedThreadSubscriptionTest() { var manager = new TransportManager( new TransportResolver(new Dictionary <string, TransportInfo> { { "transport-1", new TransportInfo("transport-1", "login1", "pwd1", "None", "InMemory") { ProcessingGroups = new Dictionary <string, ProcessingGroupInfo>() { { "pg", new ProcessingGroupInfo() { ConcurrencyLevel = 3 } } } } } })); var processingGroup = manager.GetProcessingGroup("transport-1", "pg"); var usedThreads = new List <int>(); var processedMessages = new List <int>(); Action <BinaryMessage, Action <bool> > callback = (message, action) => { lock (usedThreads) { usedThreads.Add(Thread.CurrentThread.ManagedThreadId); processedMessages.Add(int.Parse(Encoding.UTF8.GetString(message.Bytes))); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ":" + Encoding.UTF8.GetString(message.Bytes)); } Thread.Sleep(50); }; var subscription0 = processingGroup.Subscribe("queue0", callback, null, 0); var subscription1 = processingGroup.Subscribe("queue1", callback, null, 1); var subscription2 = processingGroup.Subscribe("queue2", callback, null, 2); Enumerable.Range(1, 20).ForEach(i => processingGroup.Send("queue" + i % 3, new BinaryMessage { Bytes = Encoding.UTF8.GetBytes((i % 3).ToString()) }, 0)); Thread.Sleep(1200); Assert.That(usedThreads.Count(), Is.EqualTo(20), "not all messages were processed"); Assert.That(usedThreads.Distinct().Count(), Is.EqualTo(3), "wrong number of threads was used for message processing"); double averageOrder0 = processedMessages.Select((i, index) => new { message = i, index }).Where(arg => arg.message == 0).Average(arg => arg.index); double averageOrder1 = processedMessages.Select((i, index) => new { message = i, index }).Where(arg => arg.message == 1).Average(arg => arg.index); double averageOrder2 = processedMessages.Select((i, index) => new { message = i, index }).Where(arg => arg.message == 2).Average(arg => arg.index); Assert.That(averageOrder0, Is.LessThan(averageOrder1), "priority was not respected"); Assert.That(averageOrder1, Is.LessThan(averageOrder2), "priority was not respected"); }
public void TransportFailuteHandlingTest() { var resolver = MockTransportResolver(); var transportManager = new TransportManager(resolver, new SonicTransportFactory()); using (var engine = new MessagingEngine(transportManager)) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); int failureWasReportedCount = 0; engine.SubscribeOnTransportEvents((transportid, @event) => failureWasReportedCount++); //need for transportManager to start tracking transport failures for these ids transportManager.GetProcessingGroup(TransportConstants.TRANSPORT_ID1, "test"); transportManager.GetProcessingGroup(TransportConstants.TRANSPORT_ID2, "test"); transportManager.ProcessTransportFailure( new TransportInfo(TransportConstants.BROKER, TransportConstants.USERNAME, TransportConstants.PASSWORD, "MachineName")); Assert.That(failureWasReportedCount, Is.GreaterThan(0), "Failure was not reported"); Assert.That(failureWasReportedCount, Is.EqualTo(2), "Failure was not reported for all ids"); } }
public void MultiThreadThreadSubscriptionTest() { var manager = new TransportManager( new TransportResolver(new Dictionary <string, TransportInfo> { { "transport-1", new TransportInfo("transport-1", "login1", "pwd1", "None", "InMemory") { ProcessingGroups = new Dictionary <string, ProcessingGroupInfo>() { { "pg", new ProcessingGroupInfo() { ConcurrencyLevel = 3 } } } } } })); var processingGroup = manager.GetProcessingGroup("transport-1", "pg"); var usedThreads = new List <int>(); var subscription = processingGroup.Subscribe("queue", (message, action) => { lock (usedThreads) { usedThreads.Add(Thread.CurrentThread.ManagedThreadId); Console.WriteLine(Thread.CurrentThread.Name + Thread.CurrentThread.ManagedThreadId + ":" + Encoding.UTF8.GetString(message.Bytes)); } Thread.Sleep(50); }, null, 0); Enumerable.Range(1, 20).ForEach(i => processingGroup.Send("queue", new BinaryMessage { Bytes = Encoding.UTF8.GetBytes((i % 3).ToString()) }, 0)); Thread.Sleep(1200); Assert.That(usedThreads.Count(), Is.EqualTo(20), "not all messages were processed"); Assert.That(usedThreads.Distinct().Count(), Is.EqualTo(3), "wrong number of threads was used for message processing"); }
public void ConcurrentTransportResolutionTest() { var resolver = MockTransportResolver(); var transportManager = new TransportManager(resolver, new SonicTransportFactory()); var start = new ManualResetEvent(false); int errorCount = 0; int attemptCount = 0; foreach (var i in Enumerable.Range(1, 10)) { int treadNum = i; var thread = new Thread(() => { start.WaitOne(); try { var transport = transportManager.GetProcessingGroup(TransportConstants.TRANSPORT_ID1, "test"); Console.WriteLine(treadNum + ". " + transport); Interlocked.Increment(ref attemptCount); } catch (Exception) { Interlocked.Increment(ref errorCount); } }); thread.Start(); } start.Set(); while (attemptCount < 10) { Thread.Sleep(50); } Assert.That(errorCount, Is.EqualTo(0)); }