protected override void Given()
        {
            var container         = new Container(x => x.AddRegistry(new BlockingHandlerRegistry()));
            var resolutionContext = new HandlerResolutionContext("test");

            var handlerResolver = new StructureMapHandlerResolver(container);
            var handler         = handlerResolver.ResolveHandler <OrderPlaced>(resolutionContext);

            Assert.That(handler, Is.Not.Null);

            // we use the obsolete interface"IHandler<T>" here
#pragma warning disable 618
            var blockingHandler = (BlockingHandler <OrderPlaced>)handler;
            _resolvedHandler = (BlockingOrderProcessor)blockingHandler.Inner;
#pragma warning restore 618

            DoneSignal = _resolvedHandler.DoneSignal.Task;

            Subscriber = CreateMeABus.WithLogging(new LoggerFactory())
                         .InRegion("eu-west-1")
                         .WithSqsTopicSubscriber()
                         .IntoQueue("container-test")
                         .WithMessageHandler <OrderPlaced>(handlerResolver);

            Subscriber.StartListening();
        }
Exemple #2
0
        protected override Task Given()
        {
            var container         = new Container(x => x.AddRegistry(new SingleHandlerRegistry()));
            var resolutionContext = new HandlerResolutionContext("test");

            var handlerResolver = new StructureMapHandlerResolver(container);
            var handler         = handlerResolver.ResolveHandler <OrderPlaced>(resolutionContext);

            handler.ShouldNotBeNull();

            _handlerFuture = ((OrderProcessor)handler).Future;
            DoneSignal     = _handlerFuture.DoneSignal;

            var fixture = new JustSayingFixture();

            Subscriber = fixture.Builder()
                         .WithSqsTopicSubscriber()
                         .IntoQueue("container-test")
                         .WithMessageHandler <OrderPlaced>(handlerResolver);

            SubscriberCts = new CancellationTokenSource();
            Subscriber.StartListening(SubscriberCts.Token);

            return(Task.CompletedTask);
        }
Exemple #3
0
        public void TestQueueBResolution()
        {
            var context = new HandlerResolutionContext("QueueB");
            var handler = _handlerResolver.ResolveHandler <TestMessage>(context);

            handler.ShouldNotBeNull();
            handler.ShouldBeAssignableTo <HandlerB>();
        }
Exemple #4
0
        public void TestQueueBResolution()
        {
            var context = new HandlerResolutionContext("QueueB");
            var handler = _handlerResolver.ResolveHandler <TestMessage>(context);

            Assert.That(handler, Is.Not.Null);
            Assert.That(handler, Is.InstanceOf <HandlerB>());
        }
Exemple #5
0
        public void TestOtherQueueNameResolution()
        {
            var context = new HandlerResolutionContext("QueueWithAnyOtherName");
            var handler = _handlerResolver.ResolveHandler <TestMessage>(context);

            Assert.That(handler, Is.Not.Null);
            Assert.That(handler, Is.InstanceOf <HandlerC>());
        }
Exemple #6
0
        public void TestOtherQueueNameResolution()
        {
            var context = new HandlerResolutionContext("QueueWithAnyOtherName");
            var handler = _handlerResolver.ResolveHandler <TestMessage>(context);

            handler.ShouldNotBeNull();
            handler.ShouldBeAssignableTo <HandlerC>();
        }
            public IHandlerAsync <T> ResolveHandler <T>(HandlerResolutionContext context)
            {
                if (typeof(T) == typeof(OrderPlaced) && context.QueueName.EndsWith("-dispatched", StringComparison.Ordinal))
                {
                    return(new OrderDispatcher(Future) as IHandlerAsync <T>);
                }

                throw new NotImplementedException();
            }
Exemple #8
0
        /// <inheritdoc />
        void ISubscriptionBuilder <T> .Configure(
            JustSayingBus bus,
            IHandlerResolver resolver,
            IVerifyAmazonQueues creator,
            ILoggerFactory loggerFactory)
        {
            var logger = loggerFactory.CreateLogger <TopicSubscriptionBuilder <T> >();

            var subscriptionConfig = new SqsReadConfiguration(SubscriptionType.ToTopic)
            {
                QueueName = TopicName
            };

            ConfigureReads?.Invoke(subscriptionConfig);

            var config = bus.Config;

            subscriptionConfig.ApplyTopicNamingConvention <T>(config.TopicNamingConvention);
            subscriptionConfig.ApplyQueueNamingConvention <T>(config.QueueNamingConvention);
            subscriptionConfig.SubscriptionGroupName ??= subscriptionConfig.QueueName;
            subscriptionConfig.PublishEndpoint = subscriptionConfig.TopicName;
            subscriptionConfig.Validate();

            var queueWithStartup = creator.EnsureTopicExistsWithQueueSubscribed(
                config.Region,
                bus.SerializationRegister,
                subscriptionConfig,
                config.MessageSubjectProvider);

            bus.AddStartupTask(queueWithStartup.StartupTask);

            bus.AddQueue(subscriptionConfig.SubscriptionGroupName, queueWithStartup.Queue);

            logger.LogInformation(
                "Created SQS topic subscription on topic '{TopicName}' and queue '{QueueName}'.",
                subscriptionConfig.TopicName,
                subscriptionConfig.QueueName);

            var resolutionContext = new HandlerResolutionContext(subscriptionConfig.QueueName);
            var proposedHandler   = resolver.ResolveHandler <T>(resolutionContext);

            if (proposedHandler == null)
            {
                throw new HandlerNotRegisteredWithContainerException(
                          $"There is no handler for '{typeof(T)}' messages.");
            }

            bus.AddMessageHandler(subscriptionConfig.QueueName,
                                  () => resolver.ResolveHandler <T>(resolutionContext));

            logger.LogInformation(
                "Added a message handler for message type for '{MessageType}' on topic '{TopicName}' and queue '{QueueName}'.",
                typeof(T),
                subscriptionConfig.TopicName,
                subscriptionConfig.QueueName);
        }
        public IHandlerAsync <T> ResolveHandler <T>(HandlerResolutionContext context)
        {
            var handler = _container.GetInstance <IHandlerAsync <T> >();

            if (handler != null)
            {
                return(handler);
            }

            return(null);
        }
Exemple #10
0
        public IHandlerAsync <T> ResolveHandler <T>(HandlerResolutionContext context)
        {
            var namedHandler = _container.TryGetInstance <IHandlerAsync <T> >(context.QueueName);

            if (namedHandler != null)
            {
                return(namedHandler);
            }

            return(_container.GetInstance <IHandlerAsync <T> >());
        }
        /// <inheritdoc />
        void ISubscriptionBuilder <T> .Configure(
            JustSayingBus bus,
            IHandlerResolver resolver,
            IVerifyAmazonQueues creator,
            ILoggerFactory loggerFactory)
        {
            var logger = loggerFactory.CreateLogger <QueueSubscriptionBuilder <T> >();

            var subscriptionConfig = new SqsReadConfiguration(SubscriptionType.PointToPoint)
            {
                QueueName = QueueName
            };

            ConfigureReads?.Invoke(subscriptionConfig);

            var config = bus.Config;

            subscriptionConfig.ApplyTopicNamingConvention <T>(config.TopicNamingConvention);
            subscriptionConfig.ApplyQueueNamingConvention <T>(config.QueueNamingConvention);
            subscriptionConfig.SubscriptionGroupName ??= subscriptionConfig.QueueName;
            subscriptionConfig.Validate();

            var queue = creator.EnsureQueueExists(config.Region, subscriptionConfig);

            bus.AddStartupTask(
                queue.Queue.EnsureQueueAndErrorQueueExistAndAllAttributesAreUpdatedAsync(subscriptionConfig));

            bus.AddQueue(subscriptionConfig.SubscriptionGroupName, queue.Queue);

            logger.LogInformation(
                "Created SQS subscriber for message type '{MessageType}' on queue '{QueueName}'.",
                typeof(T),
                subscriptionConfig.QueueName);

            var resolutionContext = new HandlerResolutionContext(subscriptionConfig.QueueName);
            var proposedHandler   = resolver.ResolveHandler <T>(resolutionContext);

            if (proposedHandler == null)
            {
                throw new HandlerNotRegisteredWithContainerException(
                          $"There is no handler for '{typeof(T)}' messages.");
            }

            bus.AddMessageHandler(subscriptionConfig.QueueName,
                                  () => resolver.ResolveHandler <T>(resolutionContext));

            logger.LogInformation(
                "Added a message handler for message type for '{MessageType}' on topic '{TopicName}' and queue '{QueueName}'.",
                typeof(T),
                subscriptionConfig.TopicName,
                subscriptionConfig.QueueName);
        }
        /// <inheritdoc />
        void ISubscriptionBuilder <T> .Configure(
            JustSayingBus bus,
            IHandlerResolver handlerResolver,
            IServiceResolver serviceResolver,
            IVerifyAmazonQueues creator,
            IAwsClientFactoryProxy awsClientFactoryProxy,
            ILoggerFactory loggerFactory)
        {
            var logger = loggerFactory.CreateLogger <QueueSubscriptionBuilder <T> >();

            var attachedQueueConfig = new QueueAddressConfiguration();

            ConfigureReads?.Invoke(attachedQueueConfig);

            IAmazonSQS sqsClient = awsClientFactoryProxy
                                   .GetAwsClientFactory()
                                   .GetSqsClient(RegionEndpoint.GetBySystemName(_queueAddress.RegionName));

            var queue = new QueueAddressQueue(_queueAddress, sqsClient);

            attachedQueueConfig.SubscriptionGroupName ??= queue.QueueName;
            attachedQueueConfig.Validate();

            bus.AddQueue(attachedQueueConfig.SubscriptionGroupName, queue);

            logger.LogInformation(
                "Created SQS queue subscription for '{MessageType}' on '{QueueName}'",
                typeof(T), queue.QueueName);

            var resolutionContext = new HandlerResolutionContext(queue.QueueName);
            var proposedHandler   = handlerResolver.ResolveHandler <T>(resolutionContext);

            if (proposedHandler == null)
            {
                throw new HandlerNotRegisteredWithContainerException(
                          $"There is no handler for '{typeof(T)}' messages.");
            }

            var middlewareBuilder = new HandlerMiddlewareBuilder(handlerResolver, serviceResolver);
            var handlerMiddleware = middlewareBuilder
                                    .Configure(MiddlewareConfiguration ?? (b => b.UseDefaults <T>(proposedHandler.GetType())))
                                    .Build();

            bus.AddMessageMiddleware <T>(queue.QueueName, handlerMiddleware);

            logger.LogInformation(
                "Added a message handler for message type for '{MessageType}' on queue '{QueueName}'",
                typeof(T), queue.QueueName);
        }
        protected override async Task <bool> RunInnerAsync(
            HandleMessageContext context,
            Func <CancellationToken, Task <bool> > func,
            CancellationToken stoppingToken)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            stoppingToken.ThrowIfCancellationRequested();

            var resolutionContext = new HandlerResolutionContext(context.QueueName);

            IHandlerAsync <T> handler = _handlerResolver(resolutionContext);

            return(await handler.Handle(context.MessageAs <T>()).ConfigureAwait(false));
        }
Exemple #14
0
    /// <inheritdoc />
    public IHandlerAsync <T> ResolveHandler <T>(HandlerResolutionContext context)
    {
        bool logAtDebug = Logger.IsEnabled(LogLevel.Debug);

        if (logAtDebug)
        {
            Logger.LogDebug(
                "Resolving handler for message type {MessageType} for queue {QueueName}.",
                typeof(T).FullName,
                context.QueueName);
        }

        var handlers = ServiceProvider.GetServices <IHandlerAsync <T> >().ToArray();

        if (handlers.Length == 0)
        {
            throw new InvalidOperationException($"No handler for message type {typeof(T).FullName} is registered.");
        }
        else if (handlers.Length > 1)
        {
            if (logAtDebug)
            {
                Logger.LogDebug(
                    "Resolved handler types for message type {MessageType} for queue {QueueName}: {ResolvedHandlerTypes}",
                    typeof(T).FullName,
                    context.QueueName,
                    string.Join(", ", handlers.Select((p) => p.GetType().FullName)));
            }

            throw new NotSupportedException($"{handlers.Length} handlers for message type {typeof(T).FullName} are registered. Only one handler is supported per message type.");
        }

        var handler = handlers[0];

        if (logAtDebug)
        {
            Logger.LogDebug(
                "Resolved handler of type {ResolvedHandlerType} for queue {QueueName}.",
                handler.GetType().Name,
                context.QueueName);
        }

        return(handler);
    }
        public IHandlerAsync <T> ResolveHandler <T>(HandlerResolutionContext context)
        {
            var handler = _container.GetInstance <IHandlerAsync <T> >();

            if (handler != null)
            {
                return(handler);
            }

            // we use the obsolete interface"IHandler<T>" here
            #pragma warning disable 618
            var syncHandler = _container.GetInstance <IHandler <T> >();
            if (syncHandler != null)
            {
                return(new BlockingHandler <T>(syncHandler));
            }
            #pragma warning restore 618

            return(null);
        }
        protected override void Given()
        {
            var container         = new Container(x => x.AddRegistry(new SingleHandlerRegistry()));
            var resolutionContext = new HandlerResolutionContext("test");

            var handlerResolver = new StructureMapHandlerResolver(container);
            var handler         = handlerResolver.ResolveHandler <OrderPlaced>(resolutionContext);

            handler.ShouldNotBeNull();

            _handlerFuture = ((OrderProcessor)handler).Future;
            DoneSignal     = _handlerFuture.DoneSignal;

            Subscriber = CreateMeABus.WithLogging(new LoggerFactory())
                         .InRegion("eu-west-1")
                         .WithSqsTopicSubscriber()
                         .IntoQueue("container-test")
                         .WithMessageHandler <OrderPlaced>(handlerResolver);

            Subscriber.StartListening();
        }
 public IHandlerAsync <T> ResolveHandler <T>(HandlerResolutionContext context)
 => _container.GetInstance <IHandlerAsync <T> >();
Exemple #18
0
 public IHandlerAsync <T> ResolveHandler <T>(HandlerResolutionContext context)
 {
     return((IHandlerAsync <T>)_provider.GetService(typeof(IHandlerAsync <T>)));
 }
Exemple #19
0
 public IHandlerAsync <CreateSongCommand> ResolveHandler(HandlerResolutionContext context)
 {
     return(new CreateSongCommandHandler());
 }
Exemple #20
0
 public IHandlerAsync <T> ResolveHandler <T>(HandlerResolutionContext context)
 {
     return(_container.Resolve <IHandlerAsync <T> >());
 }