コード例 #1
0
 public MessagingEngine(
     ILogFactory logFactory,
     ITransportResolver transportResolver,
     params ITransportFactory[] transportFactories)
     : this(logFactory, transportResolver, null, transportFactories)
 {
 }
コード例 #2
0
        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");
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
 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;
 }
コード例 #6
0
        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"));
            }
        }
コード例 #7
0
        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");
            }
        }
コード例 #8
0
        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();
                }
            }
        }
コード例 #9
0
 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));
 }
コード例 #10
0
        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");
            }
        }
コード例 #11
0
        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);
                }
            }
        }
コード例 #12
0
        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]);
            }
        }
コード例 #13
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");
            }
        }
コード例 #14
0
 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));
 }
コード例 #15
0
 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");
 }
コード例 #16
0
ファイル: MessagingEngine.cs プロジェクト: mmusin/Messaging
 public MessagingEngine(ITransportResolver transportResolver, params ITransportFactory[] transportFactories)
     : this(new TransportManager(transportResolver, transportFactories))
 {
 }