Пример #1
0
        /// <inheritdoc />
        void IPublicationBuilder <T> .Configure(
            JustSayingBus bus,
            IAwsClientFactoryProxy proxy,
            ILoggerFactory loggerFactory)
        {
            var logger = loggerFactory.CreateLogger <TopicPublicationBuilder <T> >();

            logger.LogInformation("Adding SNS publisher for message type '{MessageType}'.",
                                  typeof(T));

            var config = bus.Config;

            var readConfiguration  = new SqsReadConfiguration(SubscriptionType.ToTopic);
            var writeConfiguration = new SnsWriteConfiguration();

            ConfigureWrites?.Invoke(writeConfiguration);
            readConfiguration.ApplyTopicNamingConvention <T>(config.TopicNamingConvention);

            bus.SerializationRegister.AddSerializer <T>();

            foreach (var region in config.Regions)
            {
                // TODO pass region down into topic creation for when we have foreign topics so we can generate the arn
                var eventPublisher = new SnsTopicByName(
                    readConfiguration.TopicName,
                    proxy.GetAwsClientFactory().GetSnsClient(RegionEndpoint.GetBySystemName(region)),
                    bus.SerializationRegister,
                    loggerFactory,
                    writeConfiguration,
                    config.MessageSubjectProvider)
                {
                    MessageResponseLogger = config.MessageResponseLogger
                };

                async Task StartupTask()
                {
                    if (writeConfiguration.Encryption != null)
                    {
                        await eventPublisher.CreateWithEncryptionAsync(writeConfiguration.Encryption)
                        .ConfigureAwait(false);
                    }
                    else
                    {
                        await eventPublisher.CreateAsync().ConfigureAwait(false);
                    }

                    await eventPublisher.EnsurePolicyIsUpdatedAsync(config.AdditionalSubscriberAccounts)
                    .ConfigureAwait(false);
                }

                bus.AddStartupTask(StartupTask());

                bus.AddMessagePublisher <T>(eventPublisher, region);
            }

            logger.LogInformation(
                "Created SNS topic publisher on topic '{TopicName}' for message type '{MessageType}'.",
                readConfiguration.TopicName,
                typeof(T));
        }
Пример #2
0
        public static IMayWantOptionalSettings InRegions(params string[] regions)
        {
            var config = new MessagingConfig();
            
            if (regions != null)
            foreach (var region in regions)
            {
                config.Regions.Add(region);
            }

            config.Validate();

            var messageSerialisationRegister = new MessageSerialisationRegister();
            var justSayingBus = new JustSayingBus(config, messageSerialisationRegister);

            var awsClientFactoryProxy = new AwsClientFactoryProxy(() => DefaultClientFactory());
                
            var amazonQueueCreator = new AmazonQueueCreator(awsClientFactoryProxy);
            var bus = new JustSayingFluently(justSayingBus, amazonQueueCreator, awsClientFactoryProxy);

            bus
                .WithMonitoring(new NullOpMessageMonitor())
                .WithSerialisationFactory(new NewtonsoftSerialisationFactory());

            return bus;
        }
Пример #3
0
 /// <summary>
 /// Configures the publications for the <see cref="JustSayingBus"/>.
 /// </summary>
 /// <param name="bus">The <see cref="JustSayingBus"/> to configure subscriptions for.</param>
 /// <param name="proxy">The <see cref="IAwsClientFactoryProxy"/> to use to create SQS/SNS clients with.</param>
 /// <param name="loggerFactory">The <see cref="ILoggerFactory"/> logger factory to use.</param>
 internal void Configure(JustSayingBus bus, IAwsClientFactoryProxy proxy, ILoggerFactory loggerFactory)
 {
     foreach (IPublicationBuilder <Message> builder in Publications)
     {
         builder.Configure(bus, proxy, loggerFactory);
     }
 }
Пример #4
0
    private JustSayingBus CreateBus(IMessagingConfig config, ILoggerFactory loggerFactory)
    {
        IMessageSerializationRegister register = ServiceResolver.ResolveService <IMessageSerializationRegister>();
        IMessageMonitor monitor = ServiceResolver.ResolveOptionalService <IMessageMonitor>() ?? new NullOpMessageMonitor();

        var bus = new JustSayingBus(config, register, loggerFactory, monitor);

        return(bus);
    }
Пример #5
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);
        }
Пример #6
0
    /// <summary>
    /// Creates a new instance of <see cref="IMessagingBus"/>.
    /// </summary>
    /// <returns>
    /// The created instance of <see cref="IMessagingBus"/>
    /// </returns>
    public IMessagingBus BuildSubscribers()
    {
        IMessagingConfig config = MessagingConfig.Build();

        config.Validate();

        ILoggerFactory loggerFactory = ServiceResolver.ResolveService <ILoggerFactory>();

        JustSayingBus          bus     = CreateBus(config, loggerFactory);
        IAwsClientFactoryProxy proxy   = CreateFactoryProxy();
        IVerifyAmazonQueues    creator = new AmazonQueueCreator(proxy, loggerFactory);

        SubscriptionBuilder.Configure(bus, ServiceResolver, creator, proxy, loggerFactory);

        return(bus);
    }
Пример #7
0
    /// <summary>
    /// Creates a new instance of <see cref="IMessagePublisher"/>.
    /// </summary>
    /// <returns>
    /// The created instance of <see cref="IMessagePublisher"/>
    /// </returns>
    public IMessagePublisher BuildPublisher()
    {
        IMessagingConfig config = MessagingConfig.Build();

        config.Validate();

        ILoggerFactory loggerFactory = ServiceResolver.ResolveService <ILoggerFactory>();

        JustSayingBus          bus   = CreateBus(config, loggerFactory);
        IAwsClientFactoryProxy proxy = CreateFactoryProxy();

        if (PublicationsBuilder != null)
        {
            PublicationsBuilder.Configure(bus, proxy, loggerFactory);
        }

        return(bus);
    }
Пример #8
0
        public static IMayWantOptionalSettings InRegion(string region)
        {
            var config = new MessagingConfig();
            config.Regions.Add(region);

            config.Validate();

            var messageSerialisationRegister = new MessageSerialisationRegister();
            var justSayingBus = new JustSayingBus(config, messageSerialisationRegister);

            var amazonQueueCreator = new AmazonQueueCreator();
            var bus = new JustSayingFluently(justSayingBus, amazonQueueCreator);

            bus
                .WithMonitoring(new NullOpMessageMonitor())
                .WithSerialisationFactory(new NewtonsoftSerialisationFactory());

            return bus;
        }
        /// <summary>
        /// Configures the subscriptions for the <see cref="JustSayingBus"/>.
        /// </summary>
        /// <param name="bus">The <see cref="JustSayingBus"/> to configure subscriptions for.</param>
        /// <param name="creator">The <see cref="IVerifyAmazonQueues"/>to use to create queues with.</param>
        /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>logger factory to use.</param>
        /// <exception cref="InvalidOperationException">
        /// No instance of <see cref="IHandlerResolver"/> could be resolved.
        /// </exception>
        internal void Configure(
            JustSayingBus bus,
            IVerifyAmazonQueues creator,
            ILoggerFactory loggerFactory)
        {
            var resolver = Parent.ServicesBuilder?.HandlerResolver?.Invoke() ??
                           Parent.ServiceResolver.ResolveService <IHandlerResolver>();

            if (resolver == null)
            {
                throw new InvalidOperationException($"No {nameof(IHandlerResolver)} is registered.");
            }

            Defaults.Validate();

            bus.SetGroupSettings(Defaults, SubscriptionGroupSettings);

            foreach (ISubscriptionBuilder <Message> builder in Subscriptions)
            {
                builder.Configure(bus, resolver, creator, loggerFactory);
            }
        }