public Publisher(IPublisherBehavior publisher, params IBehavior <IPublisherMessageBatching>[] behaviors)
        {
            _behavior = AggregateBehavior <IPublisherMessageBatching> .Create(new PublisherBehaviorWrapper(publisher),
                                                                              behaviors);

            _observers = new HashSet <IObserver <IPublisherMessageBatching> >();
        }
示例#2
0
        public void GivenBehaviors_WhenThrow_ShouldPassException()
        {
            var behaviorMock = new Mock <IBehavior <IPublisherMessageBatching> >();

            var failureBehaviorMock = new Mock <IBehavior <IPublisherMessageBatching> >();

            failureBehaviorMock.Setup(x =>
                                      x.ExecuteAsync(
                                          It.IsAny <IPublisherMessageBatching>(),
                                          It.IsAny <Func <IPublisherMessageBatching, CancellationToken, Task> >(),
                                          It.IsAny <CancellationToken>()))
            .Throws <InvalidOperationException>()
            .Verifiable();

            var behavior =
                AggregateBehavior <IPublisherMessageBatching> .Create(behaviorMock.Object, failureBehaviorMock.Object);

            behavior.Awaiting(x => x.ExecuteAsync(null, null, CancellationToken.None))
            .Should()
            .Throw <InvalidOperationException>();

            behaviorMock.Verify(x =>
                                x.ExecuteAsync(
                                    It.IsAny <IPublisherMessageBatching>(),
                                    It.IsAny <Func <IPublisherMessageBatching, CancellationToken, Task> >(),
                                    It.IsAny <CancellationToken>()), Times.Never());
            failureBehaviorMock.VerifyAll();
        }
示例#3
0
        public override async Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered,
                                                      string exchange, string routingKey,
                                                      IBasicProperties properties, ReadOnlyMemory <byte> body)
        {
            var scopeFactory = _provider.GetRequiredService <IServiceScopeFactory>();

            using var scope = scopeFactory.CreateScope();
            var serializer = scope.ServiceProvider.GetRequiredService <ISubscriberSerializer>();

            var message = new SubscriberMessage(
                _channel,
                serializer,
                deliveryTag,
                new Routing(exchange, routingKey),
                properties,
                body);

            try
            {
                var handler   = scope.ServiceProvider.GetRequiredService <ISubscriberHandler <TMessage> >();
                var behaviors = scope.ServiceProvider.GetServices <IBehavior <ISubscriberMessage> >().ToList();
                var behavior  =
                    AggregateBehavior <ISubscriberMessage> .Create(new SubscriberBehaviorWrapper <TMessage>(handler),
                                                                   behaviors);

                await behavior.ExecuteAsync(message, null, _tokenSource.Token);

                if (!_options.AutoAck)
                {
                    return;
                }

                await message.AckAsync(_tokenSource.Token);
            }
            catch
            {
                await message.NotAckAsync(_tokenSource.Token);
            }
        }
示例#4
0
        public async Task GivenBehaviors_ShouldExecuteEveryone()
        {
            var behaviorMock = new Mock <IBehavior <IPublisherMessageBatching> >();

            behaviorMock.Setup(x =>
                               x.ExecuteAsync(
                                   It.IsAny <IPublisherMessageBatching>(),
                                   It.IsAny <Func <IPublisherMessageBatching, CancellationToken, Task> >(),
                                   It.IsAny <CancellationToken>()))
            .Returns(Task.CompletedTask)
            .Verifiable();

            using var stub1    = new StubBehavior();
            using var stub2    = new StubBehavior();
            using var stub3    = new StubBehavior();
            using var behavior =
                      AggregateBehavior <IPublisherMessageBatching> .Create(behaviorMock.Object, stub1, stub2, stub3);

            await behavior.ExecuteAsync(null, null, CancellationToken.None);

            StubBehavior.Executed.Should().Be(3);
            behaviorMock.VerifyAll();
        }