public MessagingEngine( ILogFactory logFactory, ITransportResolver transportResolver, params ITransportFactory[] transportFactories) : this(logFactory, transportResolver, null, transportFactories) { }
public void EachDestinationIsSubscribedOnDedicatedThreadTest() { ITransportResolver resolver = MockTransportResolver(); using (var engine = new MessagingEngine(resolver, new SonicTransportFactory())){ engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); var queue1MessagesThreadIds = new List <int>(); var queue2MessagesThreadIds = new List <int>(); using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake"), s => queue1MessagesThreadIds.Add(Thread.CurrentThread.ManagedThreadId))) using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE2, serializationFormat: "fake"), s => queue2MessagesThreadIds.Add(Thread.CurrentThread.ManagedThreadId))) { engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake")); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE2, serializationFormat: "fake")); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake")); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE2, serializationFormat: "fake")); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake")); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE2, serializationFormat: "fake")); Thread.Sleep(1000); } Assert.That(queue1MessagesThreadIds.Distinct().Any(), Is.True, "Messages were not processed"); Assert.That(queue2MessagesThreadIds.Distinct().Any(), Is.True, "Messages were not processed"); Assert.That(queue1MessagesThreadIds.Distinct().Count(), Is.EqualTo(1), "Messages from one subscription were processed in more then 1 thread"); Assert.That(queue2MessagesThreadIds.Distinct().Count(), Is.EqualTo(1), "Messages from one subscription were processed in more then 1 thread"); Assert.That(queue1MessagesThreadIds.First() != queue2MessagesThreadIds.First(), Is.True, "Messages from different subscriptions were processed one thread"); } }
public void SendToOverflowenQueueFailureTest() { ITransportResolver resolver = MockTransportResolver(); //Assumption: queue capacity is 1mb var halfMegabyteMessage = new string('a', 1 << 19); using (var engine = new MessagingEngine(resolver, new SonicTransportFactory())) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); engine.Send(halfMegabyteMessage, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake")); Exception exception = null; var t = new Thread(() => { try { engine.Send(halfMegabyteMessage, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake")); } catch (Exception ex) { exception = ex; } }); t.Start(); Assert.That(t.Join(2000), Is.True, "Exception was not thrown when queue is overflowed"); Assert.That(exception, Is.Not.Null); Console.WriteLine(exception); } }
public void SendTest(string dest) { ITransportResolver resolver = MockTransportResolver(); using (var engine = new MessagingEngine(resolver, new SonicTransportFactory())) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, dest), s => { })) { engine.Send(Guid.NewGuid().ToString(), new Endpoint(TransportConstants.TRANSPORT_ID1, dest)); Thread.Sleep(1000); } int i = 0; Stopwatch sw = Stopwatch.StartNew(); var done = new ManualResetEvent(false); using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, dest), s => { if (Interlocked.Increment(ref i) == 2961) { done.Set(); } })) { var message = string.Join(",", Enumerable.Range(0, 100).Select(x => Guid.NewGuid().ToString())); while (!done.WaitOne(0)) { engine.Send(message, new Endpoint(TransportConstants.TRANSPORT_ID1, dest)); } } Console.WriteLine(sw.ElapsedMilliseconds); } }
public TransportManager(ITransportResolver transportResolver, params ITransportFactory[] transportFactories) { m_TransportFactories = transportFactories.Concat(new[] { new InMemoryTransportFactory() }).ToArray(); if (transportResolver == null) { throw new ArgumentNullException("transportResolver"); } m_TransportResolver = transportResolver; }
public void SendWithCustomProperties() { ITransportResolver resolver = ObjectMother.MockTransportResolver("WeblogicMoneymail"); using (IMessagingEngine engine = new MessagingEngine(resolver, new WeblogicCustomTransportFactory())) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); engine.Send("hello world", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake")); } }
public void SharedDestinationSendSubscribeTest() { ITransportResolver resolver = MockTransportResolver(); using (var engine = new MessagingEngine(resolver, new SonicTransportFactory())) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); engine.SerializationManager.RegisterSerializer("fake", typeof(int), new FakeIntSerializer()); var recievedNonSharedMessages = new List <string>(); var recievedStrMessages = new List <string>(); var recievedIntMessages = new List <int>(); using ( engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, false, serializationFormat: "fake"), s => { recievedNonSharedMessages.Add(s); Console.WriteLine("Non-Shared dest subscription #1:" + s); })) using ( engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, true, serializationFormat: "fake"), s => { recievedStrMessages.Add(s); Console.WriteLine("Subscription #1:" + s); })) using (engine.Subscribe <int>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, true, serializationFormat: "fake"), i => { recievedIntMessages.Add(i); Console.WriteLine("Subscription #2:" + i); })) { engine.Send("11", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send("12", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send("13", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send("14", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send("15", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send(21, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send("16", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send(22, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send("23", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send(24, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send(25, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send(26, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send(27, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); engine.Send(28, new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.TOPIC, serializationFormat: "fake")); Thread.Sleep(2000); } Assert.That(recievedNonSharedMessages.Count, Is.EqualTo(14), "Not all messages from both sequences were received by non-shared subscription "); Assert.That(recievedStrMessages.Count, Is.EqualTo(7), "Not all messages from first sequence were received by corresponding subscription "); Assert.That(recievedIntMessages.Count, Is.EqualTo(7), "Not all messages from second sequence were received by corresponding subscription"); } }
public void RequestReplyTest(string dest) { ITransportResolver resolver = MockTransportResolver(); using (IMessagingEngine engine = new MessagingEngine(resolver, new SonicTransportFactory())) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); string response; using ( engine.RegisterHandler <string, string>(s => s == "ping" ? "pong" : "error", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake"))) { var stopwatch = Stopwatch.StartNew(); response = engine.SendRequest <string, string>("ping", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake")); stopwatch.Stop(); Console.WriteLine("Roundtrip: " + stopwatch.ElapsedMilliseconds + "ms"); } var requestFinished = new ManualResetEvent(false); Exception exception = null; var thread = new Thread(() => { try { engine.SendRequest <string, string>("ping", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake"), 500); } catch (Exception ex) { exception = ex; } requestFinished.Set(); }); thread.Start(); Assert.That(response, Is.EqualTo("pong")); Assert.That(requestFinished.WaitOne(2000), Is.True, "Request has not finished after timeout."); Assert.That(exception, Is.Not.Null, "Request was handled after handler registration is disposed."); Assert.That(exception, Is.InstanceOf <TimeoutException>(), "Wrong exception was thrown on timeout."); if (thread.IsAlive) { thread.Abort(); } } }
public MessagingEngine( ILog log, ITransportResolver transportResolver, IDictionary <string, ProcessingGroupInfo> processingGroups = null, params ITransportFactory[] transportFactories) { if (transportResolver == null) { throw new ArgumentNullException("transportResolver"); } _log = log; m_TransportManager = new TransportManager(log, transportResolver, transportFactories); m_ProcessingGroupManager = new ProcessingGroupManager(log, m_TransportManager, processingGroups); m_SerializationManager = new SerializationManager(log); m_RequestTimeoutManager = new SchedulingBackgroundWorker("RequestTimeoutManager", () => StopTimeoutedRequests()); CreateMessagingHandle(() => StopTimeoutedRequests(true)); }
public void ByDefaultEachDestinationIsSubscribedOnDedicatedThreadTest() { ITransportResolver resolver = MockTransportResolver(); using (var engine = new MessagingEngine(new LogToConsole(), resolver, new InMemoryTransportFactory())) { engine.SerializationManager.RegisterSerializer(SerializationFormat.Json, typeof(string), new FakeStringSerializer()); var queue1MessagesThreadIds = new List <int>(); var queue2MessagesThreadIds = new List <int>(); var messagesCounter = 0; var allMessagesAreRecieved = new ManualResetEvent(false); using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: SerializationFormat.Json), s => { queue1MessagesThreadIds.Add(Thread.CurrentThread.ManagedThreadId); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); if (Interlocked.Increment(ref messagesCounter) == 6) { allMessagesAreRecieved.Set(); } })) using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE2, serializationFormat: SerializationFormat.Json), s => { queue2MessagesThreadIds.Add(Thread.CurrentThread.ManagedThreadId); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); if (Interlocked.Increment(ref messagesCounter) == 6) { allMessagesAreRecieved.Set(); } })) { engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: SerializationFormat.Json)); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE2, serializationFormat: SerializationFormat.Json)); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: SerializationFormat.Json)); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE2, serializationFormat: SerializationFormat.Json)); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: SerializationFormat.Json)); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE2, serializationFormat: SerializationFormat.Json)); allMessagesAreRecieved.WaitOne(1000); } Assert.That(queue1MessagesThreadIds.Distinct().Any(), Is.True, "Messages were not processed"); Assert.That(queue2MessagesThreadIds.Distinct().Any(), Is.True, "Messages were not processed"); Assert.That(queue1MessagesThreadIds.Distinct().Count(), Is.EqualTo(1), "Messages from one subscription were processed in more then 1 thread"); Assert.That(queue2MessagesThreadIds.Distinct().Count(), Is.EqualTo(1), "Messages from one subscription were processed in more then 1 thread"); Assert.That(queue1MessagesThreadIds.First() != queue2MessagesThreadIds.First(), Is.True, "Messages from different subscriptions were processed one thread"); } }
public void Subscribe() { ITransportResolver resolver = ObjectMother.MockTransportResolver("Weblogic"); using (IMessagingEngine engine = new MessagingEngine(resolver, new WeblogicTransportFactory())) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); var receivedMessages = new List <object>(); using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake"), receivedMessages.Add)) { Thread.Sleep(1000); } foreach (var receivedMessage in receivedMessages) { Console.WriteLine(receivedMessage); } } }
public void SendSubscribeWithTimeToLive() { ITransportResolver resolver = ObjectMother.MockTransportResolver("Weblogic"); using (IMessagingEngine engine = new MessagingEngine(resolver, new WeblogicTransportFactory())) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); engine.Send("ping1", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake"), 200); engine.Send("ping2", new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake"), 1000); Thread.Sleep(300); var receivedMessages = new List <object>(); using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, TransportConstants.QUEUE1, serializationFormat: "fake"), receivedMessages.Add)) { Thread.Sleep(1000); } Assert.AreEqual(1, receivedMessages.Count); Assert.AreEqual("ping2", receivedMessages[0]); } }
public void SendSubscribeTest(string dest) { ITransportResolver resolver = MockTransportResolver(); using (var engine = new MessagingEngine(resolver, new SonicTransportFactory())) { engine.SerializationManager.RegisterSerializer("fake", typeof(string), new FakeStringSerializer()); var recievedMessages = new List <object>(); using (engine.Subscribe <string>(new Endpoint(TransportConstants.TRANSPORT_ID1, dest, serializationFormat: "fake"), recievedMessages.Add)) { engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, dest, serializationFormat: "fake")); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, dest, serializationFormat: "fake")); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, dest, serializationFormat: "fake")); Thread.Sleep(1000); } Assert.That(recievedMessages.Count, Is.EqualTo(3), "Some messages were not received"); Assert.That(recievedMessages, Is.EqualTo(new[] { "test", "test", "test" }), "Some messages were corrupted"); engine.Send("test", new Endpoint(TransportConstants.TRANSPORT_ID1, dest, serializationFormat: "fake")); Thread.Sleep(100); Assert.That(recievedMessages.Count, Is.EqualTo(3), "Subscription callback was called after subscription is disposed"); } }
public TransportManager(ILogFactory logFactory, ITransportResolver transportResolver, params ITransportFactory[] transportFactories) { _logFactory = logFactory ?? throw new ArgumentNullException(nameof(logFactory)); m_TransportFactories = transportFactories.Concat(new[] { new InMemoryTransportFactory() }).ToArray(); m_TransportResolver = transportResolver ?? throw new ArgumentNullException(nameof(transportResolver)); }
public TransportManager(ILog log, ITransportResolver transportResolver, params ITransportFactory[] transportFactories) { m_TransportFactories = transportFactories.Concat(new[] { new InMemoryTransportFactory() }).ToArray(); _log = log; m_TransportResolver = transportResolver ?? throw new ArgumentNullException("transportResolver"); }
public MessagingEngine(ITransportResolver transportResolver, params ITransportFactory[] transportFactories) : this(new TransportManager(transportResolver, transportFactories)) { }