PublishAsync() public static method

public static PublishAsync ( object message ) : Task,
message object
return Task,
Example #1
0
        public void TestSingleBusMultipleTypesExtensions()
        {
            var bus = new Bus <BaseMessageType>();

            var type1Received = new List <MessageType1>();
            var type2Received = new List <MessageType2>();

            var subscription1 = bus.Subscribe(b => b.OfType <BaseMessageType, MessageType1>().Handler(
                                                  msg =>
            {
                type1Received.Add(msg);
                return(Task.CompletedTask);
            }));

            var subscription2 = bus.Subscribe(b => b.OfType <BaseMessageType, MessageType2>().Handler(
                                                  msg =>
            {
                type2Received.Add(msg);
                return(Task.CompletedTask);
            }));

            bus.PublishAsync(new MessageType1("Haj"));
            bus.PublishAsync(
                new MessageType2()
            {
                Name = "Boj"
            });

            Assert.Single(type1Received);
            Assert.Single(type2Received);

            subscription2.Dispose();
            subscription1.Dispose();
        }
        public async Task TestConcurrentMessageBusPatternMatching()
        {
            // If you would rather have a single message bus for your entire application, that can be done in this way
            var bus = new Bus <MessageBase>();

            var type1Received = new List <MessageType1>();
            var type2Received = new List <MessageType2>();

            bus.SubscribeSimple(
                message =>
            {
                switch (message)
                {
                case MessageType1 msg:
                    type1Received.Add(msg);
                    break;

                case MessageType2 msg:
                    type2Received.Add(msg);
                    break;
                }

                return(Task.CompletedTask);
            });

            await bus.PublishAsync(new MessageType1("John Yolo"));

            Assert.True(type1Received.Count == 1);
            Assert.True(type2Received.Count == 0);

            await bus.PublishAsync(new MessageType2("John Yolo"));

            Assert.True(type1Received.Count == 1);
            Assert.True(type2Received.Count == 1);
        }
Example #3
0
        public async Task WeakReferenceDecoratorTest()
        {
            // new int[] { 1 }.SelectMany()
            var bus = new Bus <int>();

            Assert.Equal(0, bus.SubscriberCount);

            // Strong references
            bus.Subscribe(b => b.Concurrent(5).Retry(2, TimeSpan.FromSeconds(10)).Handler(new WeakReferenceHandler()));

            Assert.Equal(1, bus.SubscriberCount);
            GC.Collect(2, GCCollectionMode.Forced);

            await bus.PublishAsync();

            Assert.Equal(1, bus.SubscriberCount);

            // Now weak reference
            bus.Subscribe(b => b.WeakReference(new WeakReferenceHandler()));

            Assert.Equal(2, bus.SubscriberCount);
            GC.Collect(2, GCCollectionMode.Forced);
            await bus.PublishAsync();

            Assert.Equal(1, bus.SubscriberCount);
        }
Example #4
0
        public void Publish_Connection_Closed_By_Application_Never_Recovers()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString);

            _busConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName1, typeof(Accessories.MyEvent).Name, MessageDeliveryMode.Persistent, message => Accessories.Configuration.QueueName1);
            var _SUT = new Bus(_busConfigurationBuilder.Build());

            _SUT.Connect();

            Console.WriteLine("Verify connection exists. Press enter to close connection ...");
            Console.ReadKey();

            // Close the connection explicitly
            _SUT.Close();

            // Attempt to publish after closing the connection from the application, this should never happen in reality ...
            var _message = new Accessories.MyEvent(Guid.NewGuid(), "", "R1", 1, "09:00", "DDD....");
            var _result  = _SUT.PublishAsync(_message);

            Console.WriteLine("Should keep retrying to publish every second indefinitely");
            Console.WriteLine("This is due to the fact that the application initiated the close");
            Console.WriteLine("Normally, close is only called when application is closing down");
            Console.Read();
        }
Example #5
0
        public void Publish_1000_Messages_To_A_Queue_Using_Custom_Exchange()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString);

            _busConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName1, typeof(Accessories.MyEvent).Name, MessageDeliveryMode.Persistent, message => Accessories.Configuration.QueueName1);
            var _SUT = new Bus(_busConfigurationBuilder.Build());

            _SUT.Connect();

            var _tasks = new ConcurrentBag <Task <PMCG.Messaging.PublicationResult> >();

            for (int count = 0; count < 1000; count++)
            {
                var _message = new Accessories.MyEvent(Guid.NewGuid(), "", "R1", 1, "09:00", "DDD....");
                _tasks.Add(_SUT.PublishAsync(_message));
            }

            Task.WhenAll(_tasks).ContinueWith(a =>
            {
                var _taskStatusCount       = _tasks.Count(result => result.Status == TaskStatus.RanToCompletion);
                var _messagePublishedCount = _tasks.Count(result => result.Result.Status == Messaging.PublicationResultStatus.Published);
                Console.WriteLine(string.Format("RanToCompletionTaskCount expected: (1000), actual: ({0})", _taskStatusCount));
                Console.WriteLine(string.Format("MessagePublishedCount expected: (1000), actual: ({0})", _messagePublishedCount));
                Console.WriteLine("Verify that 1000 messages on queue on management ui");
            });

            Console.Read();
        }
Example #6
0
        public void Publish_A_Message_And_Consume_For_The_Same_Message_With_Nack_And_Dead_Letter_Queue()
        {
            var _capturedMessageId = string.Empty;

            var _busConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString);

            _busConfigurationBuilder.NumberOfConsumers = 2;
            _busConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName2, typeof(Accessories.MyEvent).Name, MessageDeliveryMode.Persistent, message => "test.queue.2")
            .RegisterConsumer <Accessories.MyEvent>(
                Accessories.Configuration.QueueName2,
                typeof(Accessories.MyEvent).Name,
                message => { _capturedMessageId = message.Id.ToString(); return(ConsumerHandlerResult.Errored); });
            var _SUT = new Bus(_busConfigurationBuilder.Build());

            _SUT.Connect();

            var _messageId = Guid.NewGuid();
            var _message   = new Accessories.MyEvent(_messageId, null, "R1", 1, "09:00", "DDD....");

            _SUT.PublishAsync(_message);
            Thread.Sleep(2000);

            Console.WriteLine(string.Format("Captured message id expected: ({0}), actual: ({1})", _messageId, _capturedMessageId));
            Console.WriteLine(string.Format("Ensure message with id: ({0}) no longer exists in the queue", _messageId));
            Console.WriteLine(string.Format("Ensure message with id: ({0}) exists in the dead letter queue - rejected", _messageId));
            Console.Read();
        }
Example #7
0
        public void Publish_NullMessageReturnedFromGetMessageButNoSubscribers_DoesNotThrow()
        {
            var container = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var bus       = new Bus(container);

            Assert.DoesNotThrow(() => bus.PublishAsync(() => (string)null));
        }
Example #8
0
        public void Publish_10000_Messages_And_Consume_For_The_Same_Messages_With_Ack_Connection_Closed_By_Server_Recovers_Automatically()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString);

            _busConfigurationBuilder.NumberOfConsumers = 2;
            _busConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName2, typeof(Accessories.MyEvent).Name, MessageDeliveryMode.Persistent, message => "test.queue.2")
            .RegisterConsumer <Accessories.MyEvent>(
                Accessories.Configuration.QueueName2,
                typeof(Accessories.MyEvent).Name,
                message => { return(ConsumerHandlerResult.Completed); });
            var _SUT = new Bus(_busConfigurationBuilder.Build());

            _SUT.Connect();

            Console.WriteLine("Close connection via rabbitmq management ui while loop is executing");
            for (int count = 0; count < 10000; count++)
            {
                var _messageId = Guid.NewGuid();
                var _message   = new Accessories.MyEvent(_messageId, null, "R1", 1, "09:00", "DDD....");
                _SUT.PublishAsync(_message);
            }

            Console.WriteLine("Ensure there are no messages in the queue");
            Console.WriteLine("Ensure there are some messages in the dead letter queue(reason expired)");
            Console.ReadKey();
        }
Example #9
0
        public void Publish_1000_Messages_And_Consume_For_The_Same_Messsage_On_A_Transient_Queue()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString);

            _busConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName1, typeof(Accessories.MyEvent).Name)
            .RegisterConsumer <Accessories.MyEvent>(
                typeof(Accessories.MyEvent).Name,
                message => { return(ConsumerHandlerResult.Completed); },
                Accessories.Configuration.ExchangeName1);
            var _SUT = new Bus(_busConfigurationBuilder.Build());

            _SUT.Connect();

            Console.WriteLine("Wait for transient queue to appear on management ui");
            Console.ReadKey();

            var _message = new Accessories.MyEvent(Guid.NewGuid(), "Correlation Id", "R1", 1, "09:00", "....");

            for (int count = 0; count < 1000; count++)
            {
                _SUT.PublishAsync(_message);
            }

            Console.WriteLine("Ensure there are no messages in the queue");
            Console.WriteLine("Ensure transient queue appears and disappears");
            Console.ReadKey();
        }
Example #10
0
        public void Publish_1000_Messages_And_Consume_For_The_Same_Messages_With_Half_Acked_Half_Nacked()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString);

            _busConfigurationBuilder.NumberOfConsumers = 2;
            _busConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName2, typeof(Accessories.MyEvent).Name, MessageDeliveryMode.Persistent, message => "test.queue.2")
            .RegisterConsumer <Accessories.MyEvent>(
                Accessories.Configuration.QueueName2,
                typeof(Accessories.MyEvent).Name,
                message => { return(bool.Parse(message.RunIdentifier) ? ConsumerHandlerResult.Completed : ConsumerHandlerResult.Errored); });
            var _SUT = new Bus(_busConfigurationBuilder.Build());

            _SUT.Connect();

            for (int count = 0; count < 1000; count++)
            {
                var _messageId     = Guid.NewGuid();
                var _runIdentifier = (count % 2 == 0);
                var _message       = new Accessories.MyEvent(_messageId, null, _runIdentifier.ToString(), 1, "09:00", "DDD....");
                _SUT.PublishAsync(_message);
            }

            Console.WriteLine("Ensure there are no messages in the queue");
            Console.WriteLine("Ensure 500 messages exists in the dead letter queue - rejected");
            Console.Read();
        }
Example #11
0
        public void Consume_Continues_When_Node_We_Are_Not_Connected_To_Is_Blocked()
        {
            var _publisherBusConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString.Replace("myTestConnection", "publisher"));

            _publisherBusConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName1, typeof(Accessories.MyEvent).Name, MessageDeliveryMode.Persistent, message => "test.queue.1");
            var _publisherBus = new Bus(_publisherBusConfigurationBuilder.Build());

            _publisherBus.Connect();

            // Let node that we are connected to = NodeA
            // Let other node = NodeB

            // Before blocking rabbitmq service on NodeB, verify cluster is in working order
            // We publish 50,000 messages and verify that these are on the queue
            // We continuously consume the 50,000 messages
            // During consumption, block NodeB for a period of time, then unblock
            //		rabbitmqctl set_vm_memory_high_watermark 0.0000001
            //		rabbitmqctl set_vm_memory_high_watermark 0.4
            // Verify 0 messages exist on queue
            // Verify consumed message count is at least 50,000

            for (int count = 0; count < 50000; count++)
            {
                var _messageId = Guid.NewGuid();
                var _message   = new Accessories.MyEvent(_messageId, null, "R1", 1, "09:00", "DDD....");
                _publisherBus.PublishAsync(_message);
            }

            Console.WriteLine("Verify exactly 50000 messages in the queue");
            // Note that we see that a number of messages seem to get delivered more than once. This however is expected behaviour as we are using acknowledgements
            // See link: https://groups.google.com/forum/#!topic/rabbitmq-users/PODU8wIYmQs
            Console.ReadKey();

            var _consumedMessageCount            = 0;
            var _consumerBusConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString.Replace("myTestConnection", "consumer"));

            _consumerBusConfigurationBuilder.NumberOfConsumers = 5;
            _consumerBusConfigurationBuilder
            .RegisterConsumer <Accessories.MyEvent>(
                Accessories.Configuration.QueueName1,
                typeof(Accessories.MyEvent).Name,
                message => {
                Interlocked.Increment(ref _consumedMessageCount);
                return(ConsumerHandlerResult.Completed);
            });
            var _consumerBus = new Bus(_consumerBusConfigurationBuilder.Build());

            _consumerBus.Connect();

            for (int _counter = 0; _counter < 60; _counter++)
            {
                Thread.Sleep(1000);
                Console.WriteLine(string.Format("{0} seconds completed", _counter));
            }

            Console.WriteLine("Ensure there are no messages in the queue");
            Console.WriteLine(string.Format("Consumed message count expected(at least): (50000), actual: ({0})", _consumedMessageCount));
            Console.ReadKey();
        }
Example #12
0
        public void Publish_NullGetMessage_ThrowsArgumentNullException()
        {
            var container = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var bus       = new Bus(container);

            Assert.Throws <ArgumentNullException>(() => bus.PublishAsync((Func <string>)null));
        }
Example #13
0
        public void Publish_ActualMessageButNoSubscribers_DoesntThrownException()
        {
            var container = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var bus       = new Bus(container);

            Assert.DoesNotThrow(() => bus.PublishAsync("test"));
        }
Example #14
0
        public async Task HandleAsync(FakeCommand message)
        {
            Logger.LogInformation("Handle FakeCommand {ObjectId}", message.ObjectId);

            var tasksToRun = new List <Task>();

            await LockProvider.TryUsingAsync(message.ObjectId, async token =>
            {
                var ex = await Repository.CheckAggregateExists <FakeAggregate>(message.ObjectId);

                FakeAggregate agg;

                if (!ex)
                {
                    agg = FakeAggregate.Factory.Create(message.ObjectId);
                }
                else
                {
                    agg = await Repository.GetByIdAsync <FakeAggregate>(message.ObjectId);
                }

                agg.DoFakeEvent(message.Text);
                var evnts = await Repository.SaveAsyncWithOutPush(agg, CancellationToken);

                foreach (var evnt in evnts)
                {
                    tasksToRun.Add(Bus.PublishAsync(evnt));
                }
                //await Repository.SaveAsync(agg, CancellationToken);
            },
                                             cancellationToken : CancellationToken);

            await Task.WhenAll(tasksToRun);
        }
Example #15
0
        public async Task UseCustomPublisherTests()
        {
            var mypublisher = new MyPublisher();
            var bus         = new Bus <int>(options => options.UseCustomPublisher(mypublisher));

            await bus.PublishAsync(55);

            await bus.PublishAsync(1);

            await bus.PublishAsync(5);

            Assert.Equal(3, mypublisher.Messages.Count);

            Assert.Equal(55, mypublisher.Messages[0]);
            Assert.Equal(1, mypublisher.Messages[1]);
            Assert.Equal(5, mypublisher.Messages[2]);
        }
Example #16
0
        private async Task PublishInternalAsync(T message, MessageProperties properties)
        {
            var serializer        = Serializer.Get(properties.ContentType);
            var serializedMessage = serializer.Serialize(message);

            var exchange = new Exchange(ExchangeConfiguration.Name);

            await Bus.PublishAsync(exchange, QueueConfiguration.RoutingKey, true, properties, serializedMessage);
        }
Example #17
0
        public void Consume_Continues_When_Node_We_Are_Connected_To_Is_Rebooted()
        {
            var _publisherBusConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString.Replace("myTestConnection", "publisher"));

            _publisherBusConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName1, typeof(Accessories.MyEvent).Name, MessageDeliveryMode.Persistent, message => "test.queue.1");
            var _publisherBus = new Bus(_publisherBusConfigurationBuilder.Build());

            _publisherBus.Connect();

            // Let node that we are connected to = NodeA
            // Let other node = NodeB

            // Before rebooting NodeA, verify cluster is in working order
            // We publish 50,000 messages and verify that these are on the queue
            // We continuously consume the 50,000 messages
            // During consumption, reboot NodeA
            // Verify 0 messages exist on queue
            // Verify consumed message count is nearly 50,000

            for (int count = 0; count < 50000; count++)
            {
                var _messageId = Guid.NewGuid();
                var _message   = new Accessories.MyEvent(_messageId, null, "R1", 1, "09:00", "DDD....");
                _publisherBus.PublishAsync(_message);
            }

            Console.WriteLine("Verify at least 50000 messages in the queue");
            Console.ReadKey();

            var _consumedMessageCount            = 0;
            var _consumerBusConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString.Replace("myTestConnection", "consumer"));

            _consumerBusConfigurationBuilder.NumberOfConsumers = 5;
            _consumerBusConfigurationBuilder
            .RegisterConsumer <Accessories.MyEvent>(
                Accessories.Configuration.QueueName1,
                typeof(Accessories.MyEvent).Name,
                message => {
                Interlocked.Increment(ref _consumedMessageCount);
                return(ConsumerHandlerResult.Completed);
            });
            var _consumerBus = new Bus(_consumerBusConfigurationBuilder.Build());

            _consumerBus.Connect();

            for (int _counter = 0; _counter < 60; _counter++)
            {
                Thread.Sleep(1000);
                Console.WriteLine(string.Format("{0} seconds completed", _counter));
            }

            Console.WriteLine("Ensure there are no messages in the queue");
            Console.WriteLine(string.Format("Consumed message count expected(nearly): (50000), actual: ({0})", _consumedMessageCount));
            Console.ReadKey();
        }
Example #18
0
        internal void PingRequestHandler([NotNull] PingRequestMessage message)
        {
            var reply = new PingResponseMessage
            {
                ServiceName = m_Name,
                Request     = message.Request
            };

            Bus.PublishAsync(reply);
        }
Example #19
0
        public async Task Publish_GetMessageWhenNoSubscribers_IsNotCalled()
        {
            var container  = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var bus        = new Bus(container);
            var getMessage = Substitute.For <Func <string> >();

            await bus.PublishAsync(getMessage);

            getMessage.DidNotReceive().Invoke();
        }
Example #20
0
        public void Publish_NullMessageReturnedFromGetMessage_ThrowsInvalidOperationException()
        {
            var container  = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var bus        = new Bus(container);
            var subscriber = Substitute.For <ISubscriber <string> >();

            bus.Subscribe(subscriber);

            Assert.Throws <InvalidOperationException>(() => bus.PublishAsync(() => (string)null));
        }
Example #21
0
        public void When_publishing_an_event_should_invoke_all_registered_event_handlers()
        {
            var serviceContainer = new ServiceContainer();
            serviceContainer.RegisterAssembly(typeof (BusTests).Assembly, (serviceType, implementingType) => serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() == typeof (IHandleMessages<>));
            var bus = new Bus(serviceContainer.GetAllInstances);
            var message = new Event();

            bus.PublishAsync(message);

            message.NumberOfTimesHandled.ShouldEqual(2);
        }
Example #22
0
		public void PublishAsync_Null_Message_Results_In_An_Exception()
		{
			var _busConfigurationBuilder = new BusConfigurationBuilder();
			_busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
			var _busConfirguration = _busConfigurationBuilder.Build();

			var _SUT = new Bus(_busConfirguration);
			_SUT.Connect();

			_SUT.PublishAsync<MyEvent>(null);
		}
Example #23
0
        public async Task Publish_OneSubscriber_CallsThatSubscriber()
        {
            var    container = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var    bus       = new Bus(container);
            string message   = null;

            bus.Subscribe <string>(m => message = m);

            await bus.PublishAsync("Test");

            Assert.That(message, Is.EqualTo("Test"));
        }
Example #24
0
        public async Task Publish_OneSubscriberThatHasBeenUnsubscribed_DoesNotCallThatSubscriber()
        {
            var    container = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var    bus       = new Bus(container);
            string message   = null;

            bus.Subscribe <string>(m => message = m).Dispose();

            await bus.PublishAsync("Test");

            Assert.That(message, Is.Null);
        }
Example #25
0
        private void OnConsoleOnCancelKeyPress(object s, ConsoleCancelEventArgs e)
        {
            Logger.Log(LogLevel.Debug, "User cancelled application with Ctrl+C");
            WasCancelledByUser = true;
            if (e != null)
            {
                e.Cancel = true;
            }

            _CtrlCCancellationTokenSource.Cancel();
            _ApplicationLifetimeManager.SignalGracefulTermination();
            Bus.PublishAsync(new UserCancellationKeypressMessage());
        }
Example #26
0
 public override async Task Send <T>(T o, int timeout = 0)
 {
     if (timeout.Equals(0))
     {
         await Bus.PublishAsync(o);
     }
     else
     {
         await Bus.PublishAsync(o, i =>
         {
             i.WithExpires(timeout);
         });
     }
 }
        public void Bus_PublishAsync_EventHub_Nominal()
        {
            var id = Guid.NewGuid();

            bool testOk = false;

            var message = new TestMessage()
            {
                SomeData = id.ToString()
            };

            var  serializer = new JSONSerializer();
            var  publisher  = new AzureEventHubPublishTransport(serializer);
            IBus bus        = new Bus(serializer, new AzureStorageQueueSendTransport(serializer), publisher);

            bus.Context = new AFBusMessageContext();

            bus.PublishAsync(message, TOPICNAME).Wait();

            var eventProcessorHost = new EventProcessorHost(TOPICNAME, PartitionReceiver.DefaultConsumerGroupName, SettingsUtil.GetSettings <string>(SETTINGS.AZURE_EVENTHUB), SettingsUtil.GetSettings <string>(SETTINGS.AZURE_STORAGE), "eventhubcontainer");

            // Registers the Event Processor Host and starts receiving messages
            var readingTask = eventProcessorHost.RegisterEventProcessorFactoryAsync(new AzureStreamProcessorFactory(stringMessage =>

            {
                var finalMessageEnvelope = JsonConvert.DeserializeObject <AFBusMessageEnvelope>(stringMessage, new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.Objects,
                    TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple
                });

                var finalMessage = JsonConvert.DeserializeObject <TestMessage>(finalMessageEnvelope.Body, new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.Objects,
                    TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple
                });

                testOk = testOk || (id.ToString() == finalMessage.SomeData);
            }));



            Task.Delay(5000).Wait();


            // Disposes of the Event Processor Host
            eventProcessorHost.UnregisterEventProcessorAsync().Wait();

            Assert.IsTrue(testOk);
        }
Example #28
0
        public void When_publishing_an_event_should_polymorphic_dispatch_to_all_handlers()
        {
            var serviceContainer = new ServiceContainer();
            serviceContainer.Register<IHandleMessages<Event>, EventHandler>();
            serviceContainer.Register<IHandleMessages<Event>, AnotherEventHandler>("Another");
            var messageHandler = new MessageHandler();
            serviceContainer.RegisterInstance<IHandleMessages<IMessage>>(messageHandler);
            var bus = new Bus(serviceContainer.GetAllInstances);
            var message = new Event();

            bus.PublishAsync(message);

            message.NumberOfTimesHandled.ShouldEqual(2);
            messageHandler.IsHandled.ShouldBeTrue();
        }
Example #29
0
        public async Task Publish_GetMessageWhenSubscribers_IsCalled()
        {
            var container  = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var bus        = new Bus(container);
            var getMessage = Substitute.For <Func <string> >();
            var subscriber = Substitute.For <ISubscriber <string> >();

            getMessage.Invoke().Returns("Message");
            bus.Subscribe(subscriber);

            await bus.PublishAsync(getMessage);

            getMessage.Received().Invoke();
            subscriber.Received().Notify("Message");
        }
Example #30
0
        public async Task Publish_SubscriberThatHasBeenCollected_DoesNotCallThatSubscriber()
        {
            var container = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var bus       = new Bus(container);

            Subscriber.LastMessage = null;
            Subscribe(bus);

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            await bus.PublishAsync("Test");

            Assert.That(Subscriber.LastMessage, Is.Null);
        }
Example #31
0
        public static async Task MainExampleAsync()
        {
            ColorConsole.WriteLine();
            ColorConsole.WriteLine(ConsoleColor.White, "** MainExample **");

            // Create a message bus
            var bus = new Bus <ExampleMessage>();

            // "Use<ExampleMessage>.Bus" is a shortcut to a singleton bus instance for ExampleMessage
            // var bus = Use<ExampleMessage>.Bus;

            // Add a synchronous subscriber
            var subscription = bus
                               .SubscribeSimple(message => Console.WriteLine(message.Id));

            // Add an asynchronous subscriber
            var asynchronousSubscription = bus
                                           .SubscribeSimple(async message =>
            {
                await SomeMethodAsync();
                Console.WriteLine(message.Id);
            });

            // Publish a message to the bus awaiting the message to pass through
            await bus.PublishAsync(
                new ExampleMessage
            {
                Id = "Message 1"
            });

            // Publish a message but do not wait for any asynchronous operations
            bus.Publish(
                new ExampleMessage
            {
                Id = "Message 2"
            });


            // Unsubscribe - the subscription implements IDisposable. Calling Dispose() unsubscribes
            subscription.Dispose();
            asynchronousSubscription.Dispose();

            await Task.Delay(TimeSpan.FromMilliseconds(200));

            ColorConsole.WriteLine();
            ColorConsole.WriteLine(ConsoleColor.White, "** End of MainExample **");
        }
Example #32
0
        public async Task Publish_SubscriberThatHasNotBeenCollectedThroughSubscription_CallsThatSubscriber()
        {
            var container = ContainerFactory.Bootstrap <EmptyServicesBootstrapper>();
            var bus       = new Bus(container);

            Subscriber.LastMessage = null;
            var subscription = SubscribeAndReturnSubscription(bus);

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            await bus.PublishAsync("Test");

            Assert.That(Subscriber.LastMessage, Is.EqualTo("Test"));
            GC.KeepAlive(subscription);
        }
Example #33
0
        public void Publish_Continues_When_Node_We_Are_Connected_To_Is_Blocked()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder(Accessories.Configuration.ConnectionSettingsString);

            _busConfigurationBuilder
            .RegisterPublication <Accessories.MyEvent>(Accessories.Configuration.ExchangeName1, typeof(Accessories.MyEvent).Name, MessageDeliveryMode.Persistent, message => Accessories.Configuration.QueueName1);
            var _SUT = new Bus(_busConfigurationBuilder.Build());

            _SUT.Connect();

            // Let node that we are connected to = NodeA
            // Let other node = NodeB

            // Before blocking NodeA, verify cluster is in working order
            // We publish continuously for 10,000 messages
            // During publication, block NodeA for a period of time, then unblock
            //		rabbitmqctl set_vm_memory_high_watermark 0.0000001
            //		rabbitmqctl set_vm_memory_high_watermark 0.4
            // Verify 10,000 messages exist on queue
            // Verify cluster is in working order

            // NOTE: When we run high volume very fast we see messages go missing, we do not think this is worth chasing up on
            // We also know that for some edge cases, channel.BasicPublish can execute where the messages simply go missing, this is simply another one of these use cases

            var _tasks = new ConcurrentBag <Task <PMCG.Messaging.PublicationResult> >();

            for (int count = 0; count < 10000; count++)
            {
                var _message = new Accessories.MyEvent(Guid.NewGuid(), "", "R1", 1, "09:00", "DDD....");
                _tasks.Add(_SUT.PublishAsync(_message));
                Console.WriteLine(count);
                Thread.Sleep(1);
            }

            Task.WhenAll(_tasks).ContinueWith(a =>
            {
                var _taskStatusCount       = _tasks.Count(result => result.Status == TaskStatus.RanToCompletion);
                var _messagePublishedCount = _tasks.Count(result => result.Result.Status == Messaging.PublicationResultStatus.Published);
                Console.WriteLine(string.Format("RanToCompletionTaskCount expected(nearly): (10000), actual: ({0})", _taskStatusCount));
                Console.WriteLine(string.Format("MessagePublishedCount expected(nearly): (10000), actual: ({0})", _messagePublishedCount));
            });

            Console.Read();
        }
Example #34
0
        public void When_sending_the_same_event_multiple_times_should_get_handlers_from_cahce()
        {
            var serviceContainer = new ServiceContainer();
            serviceContainer.RegisterAssembly(typeof (BusTests).Assembly, (serviceType, implementingType) => serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() == typeof (IHandleMessages<>));
            IBus bus = new Bus(serviceContainer.GetAllInstances);
            var message = new Event();

            Assert.DoesNotThrow(() =>
            {
                bus.PublishAsync(message);
                bus.PublishAsync(message);
                bus.PublishAsync(message);
            });
        }
Example #35
0
        public void When_event_handler_throws_exception_should_propagate_exception()
        {
            var serviceContainer = new ServiceContainer();
            serviceContainer.Register<IHandleMessages<EventWithException>, EventWithExceptionHandler>();
            var bus = new Bus(serviceContainer.GetAllInstances);

            Assert.Throws<InvalidOperationException>(() => bus.PublishAsync(new EventWithException()).Wait());
        }