public static void UseEventMessageProcessor(
     this IAppBuilder app,
     EventProcessorHost eventProcessorHost,
     EventDataSerializer serializer,
     IMessageHandler messageHandler)
 {
     app.UseEventMessageProcessor(
         eventProcessorHost,
         serializer,
         messageHandler,
         _defaultExceptionHandler);
 }
Example #2
0
        public async Task UseEventMessageProcessor_registers_EventMessageProcessorFactory_correctly()
        {
            // Arrange
            var message  = fixture.Create <BlogPostCreated>();
            var envelope = new Envelope(message);

            Envelope handled        = null;
            var      messageHandler = Mock.Of <IMessageHandler>();

            Mock.Get(messageHandler)
            .Setup(x => x.Handle(It.IsNotNull <Envelope>(), It.IsAny <CancellationToken>()))
            .Callback <Envelope, CancellationToken>((m, t) => handled = m)
            .Returns(Task.FromResult(true));

            var serializer     = new EventDataSerializer();
            var eventHubClient = EventHubClient.CreateFromConnectionString(eventHubConnectionString, eventHubPath);
            var messageBus     = new EventHubMessageBus(eventHubClient, serializer);

            CancellationToken cancellationToken;

            using (TestServer server = TestServer.Create(app =>
            {
                app.UseEventMessageProcessor(
                    new EventProcessorHost(
                        eventHubPath,
                        consumerGroupName,
                        eventHubConnectionString,
                        storageConnectionString),
                    serializer,
                    messageHandler);
                var properties = new AppProperties(app.Properties);
                cancellationToken = properties.OnAppDisposing;
            }))
            {
                // Act
                await messageBus.Send(envelope, CancellationToken.None);

                for (int i = 0; i < 10 && handled == null; i++)
                {
                    await Task.Delay(TimeSpan.FromMilliseconds(1000));
                }

                // Assert
                Mock.Get(messageHandler).Verify(x => x.Handle(It.IsAny <Envelope>(), cancellationToken), Times.Once());
                handled.ShouldBeEquivalentTo(envelope, opts => opts.RespectingRuntimeTypes());
            }
        }
        public static void UseEventMessageProcessor(
            this IAppBuilder app,
            EventProcessorHost eventProcessorHost,
            EventDataSerializer serializer,
            IMessageHandler messageHandler,
            IMessageProcessingExceptionHandler <EventData> exceptionHandler)
        {
            if (app == null)
            {
                throw new ArgumentNullException(nameof(app));
            }

            if (eventProcessorHost == null)
            {
                throw new ArgumentNullException(nameof(eventProcessorHost));
            }

            if (serializer == null)
            {
                throw new ArgumentNullException(nameof(serializer));
            }

            if (messageHandler == null)
            {
                throw new ArgumentNullException(nameof(messageHandler));
            }

            if (exceptionHandler == null)
            {
                throw new ArgumentNullException(nameof(exceptionHandler));
            }

            CancellationToken cancellationToken = new AppProperties(app.Properties).OnAppDisposing;

            var processorFactory = new EventMessageProcessorFactory(
                serializer,
                messageHandler,
                exceptionHandler,
                cancellationToken);

            Start(eventProcessorHost, processorFactory);

            cancellationToken.Register(() => Stop(eventProcessorHost));
        }
Example #4
0
        private IReadOnlyList <EventData> SerializeEventData(OperationContext context, ContentLocationEventData[] events)
        {
            // EventDataSerializer is not thread-safe.
            // This is usually not a problem, because the nagle queue that is used by this class
            // kind of guarantees that it would be just a single thread responsible for sending the events
            // to event hub.
            // But this is not the case when the batch size is 1 (used by tests only).
            // In this case a special version of a nagle queue is created, that doesn't have this guarantee.
            // In this case this method can be called from multiple threads causing serialization/deserialization issues.
            // So to prevent random test failures because of the state corruption we're using lock
            // if the batch size is 1.
            if (_configuration.EventBatchSize == 1)
            {
                lock (EventDataSerializer)
                {
                    return(EventDataSerializer.Serialize(context, events));
                }
            }

            return(EventDataSerializer.Serialize(context, events));
        }
Example #5
0
 private IReadOnlyList <EventData> SerializeEventData(OperationContext context, ContentLocationEventData[] events)
 {
     return(EventDataSerializer.Serialize(context, events));
 }