public async Task Then_The_Handler_Only_Receives_The_Message_Once()
        {
            // Arrange
            var messageLock = new MessageLockStore();
            var handler     = new ExactlyOnceHandlerNoTimeout();

            var services = GivenJustSaying()
                           .ConfigureJustSaying((builder) => builder.WithLoopbackTopic <SimpleMessage>(UniqueName))
                           .ConfigureJustSaying((builder) => builder.Services((config) => config.WithMessageLock(() => messageLock)))
                           .AddJustSayingHandlers(new[] { handler });

            await WhenAsync(
                services,
                async (publisher, listener, serviceProvider, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                var message = new SimpleMessage();

                // Act
                await publisher.PublishAsync(message, cancellationToken);
                await publisher.PublishAsync(message, cancellationToken);
                await Task.Delay(1.Seconds(), cancellationToken);

                // Assert
                handler.NumberOfTimesIHaveBeenCalledForMessage(message.UniqueKey()).ShouldBe(1);
            });
        }
        public async Task Then_The_Handler_Only_Receives_The_Message_Once()
        {
            // Arrange
            var messageLock = new MessageLockStore();
            var handler     = new InspectableHandler <SimpleMessage>();

            var services = GivenJustSaying()
                           .AddSingleton <IMessageLockAsync>(messageLock)
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName,
                                                                                          c =>
                                                                                          c.WithReadConfiguration(rc =>
                                                                                                                  rc.WithMiddlewareConfiguration(m =>
                                                                                                                                                 m.UseExactlyOnce <SimpleMessage>("simple-message-lock")))))
                           .AddJustSayingHandlers(new[] { handler });

            await WhenAsync(
                services,
                async (publisher, listener, serviceProvider, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                var message = new SimpleMessage();

                // Act
                await publisher.PublishAsync(message, cancellationToken);
                await publisher.PublishAsync(message, cancellationToken);
                await Task.Delay(1.Seconds(), cancellationToken);

                handler.ReceivedMessages.Where(m => m.Id.ToString() == message.UniqueKey())
                .ShouldHaveSingleItem();
            });
        }
Exemplo n.º 3
0
        public async Task Then_Both_Handlers_Receive_The_Message()
        {
            var messageLock = new MessageLockStore();

            var handler1 = new InspectableHandler <SimpleMessage>();
            var handler2 = new InspectableHandler <SimpleMessage>();

            var services = GivenJustSaying()
                           .AddSingleton <IMessageLockAsync>(messageLock)
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName,
                                                                                          t => t.WithReadConfiguration(rc =>
                                                                                                                       rc.WithMiddlewareConfiguration(m =>
                                                                                                                                                      m.UseExactlyOnce <SimpleMessage>("some-key")))))
                           .AddJustSayingHandlers(new[] { handler1, handler2 });

            await WhenAsync(
                services,
                async (publisher, listener, serviceProvider, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                var message = new SimpleMessage();

                // Act
                await publisher.PublishAsync(message, cancellationToken);
                await Task.Delay(1.Seconds(), cancellationToken);

                // Assert
                handler1.ReceivedMessages.ShouldHaveSingleItem().Id.ShouldBe(message.Id);
                handler2.ReceivedMessages.ShouldHaveSingleItem().Id.ShouldBe(message.Id);
            });
        }
        public async Task Then_The_Handler_Only_Receives_The_Message_Once()
        {
            // Arrange
            var messageLock = new MessageLockStore();
            var handler     = new InspectableHandler <SimpleMessage>();

            var services = GivenJustSaying()
                           .AddSingleton <IMessageLockAsync>(messageLock)
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName,
                                                                                          c => c.WithMiddlewareConfiguration(m =>
                                                                                                                             m.UseExactlyOnce <SimpleMessage>("lock-simple-message")
                                                                                                                             .UseDefaults <SimpleMessage>(handler.GetType()))))
                           .AddJustSayingHandlers(new[] { handler });

            var    message = new SimpleMessage();
            string json    = "";

            await WhenAsync(
                services,
                async (publisher, listener, serviceProvider, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                // Act
                await publisher.PublishAsync(message, cancellationToken);
                await publisher.PublishAsync(message, cancellationToken);

                dynamic middlewares = ((dynamic)listener.Interrogate().Data).Middleware;
                json = JsonConvert.SerializeObject(middlewares, Formatting.Indented)
                       .Replace(UniqueName, "TestQueueName");

                await Patiently.AssertThatAsync(() =>
                {
                    handler.ReceivedMessages.Where(m => m.Id.ToString() == message.UniqueKey())
                    .ShouldHaveSingleItem();
                });
            });

            json.ShouldMatchApproved(c => c.SubFolder("Approvals"));
        }