Esempio n. 1
0
 private LoopbackHost(IPlatibusConfiguration configuration)
 {
     if (configuration == null) throw new ArgumentNullException("configuration");
     _baseUri = new Uri("http://localhost");
     _bus = new Bus(configuration, _baseUri, _transportService, new InMemoryMessageQueueingService());
     _transportService = new LoopbackTransportService(_bus.HandleMessage);
 }
        /// <summary>
        /// Initializes a new <see cref="MessageJournalConsumer"/> with the specified configuration
        /// and services
        /// </summary>
        /// <remarks>
        /// Message journal consumers created with this constructor use an internal <see cref="Bus"/>
        /// instance based on the <see cref="LoopbackTransportService"/> and <see cref="VirtualMessageQueueingService"/>
        /// to minimize overhead of message processing.
        /// </remarks>
        /// <param name="configuration">The bus configuration</param>
        /// <param name="options">(Optional) Options to customize the behavior of the message journal consumer</param>
        /// <exception cref="ArgumentNullException">Thrown if any of the parameters are <c>null</c></exception>
        public MessageJournalConsumer(IPlatibusConfiguration configuration, MessageJournalConsumerOptions options)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            _diagnosticService = configuration.DiagnosticService;
            _messageJournal    = configuration.MessageJournal ?? throw new ConfigurationErrorsException("Message journal is required");
            _bus = InitBus(configuration);

            var myOptions = options ?? new MessageJournalConsumerOptions();

            _filter    = myOptions.Filter;
            _batchSize = myOptions.BatchSize > 0
                ? myOptions.BatchSize
                : MessageJournalConsumerOptions.DefaultBatchSize;

            _rethrowExceptions  = myOptions.RethrowExceptions;
            _haltAtEndOfJournal = myOptions.HaltAtEndOfJournal;
            _pollingInterval    = myOptions.PollingInterval > TimeSpan.Zero
                ? myOptions.PollingInterval
                : MessageJournalConsumerOptions.DefaultPollingInterval;

            _progress = myOptions.Progress;
        }
        /// <summary>
        /// Checks the <see cref="IPlatibusConfiguration.SendRules"/> within the specified
        /// <paramref name="configuration"/> for errors or inconsistences.
        /// </summary>
        /// <param name="configuration">The configuration to validate</param>
        public static void ValidateSendRules(this IPlatibusConfiguration configuration)
        {
            if (configuration == null)
            {
                return;
            }

            var endpoints     = configuration.Endpoints;
            var sendRuleIndex = 0;

            foreach (var sendRule in configuration.SendRules)
            {
                var targetEndpointNames = sendRule.Endpoints.ToList();
                if (!targetEndpointNames.Any())
                {
                    throw new InvalidSendRuleException("Send rule [" + sendRuleIndex + "] does not reference any endpoints");
                }

                foreach (var targetEndpointName in sendRule.Endpoints)
                {
                    if (!endpoints.Contains(targetEndpointName))
                    {
                        throw new InvalidSendRuleException("Send rule [" + sendRuleIndex + "] references unknown endpoint " + targetEndpointName);
                    }
                }
                sendRuleIndex++;
            }
        }
Esempio n. 4
0
 public static async Task<LoopbackHost> Start(IPlatibusConfiguration configuration,
     CancellationToken cancellationToken = default(CancellationToken))
 {
     if (configuration == null) throw new ArgumentNullException("configuration");
     var host = new LoopbackHost(configuration);
     await host.Init(cancellationToken);
     return host;
 }
        private static async Task <IBus> InitBus(IPlatibusConfiguration configuration)
        {
            var transportService      = new LoopbackTransportService();
            var messageQueuingService = new VirtualMessageQueueingService();

            var bus = new Bus(configuration, new Uri("urn:loopback"), transportService, messageQueuingService);
            await bus.Init();

            return(bus);
        }
        /// <summary>
        /// Checks the <see cref="IPlatibusConfiguration.Subscriptions"/> within the specified
        /// <paramref name="configuration"/> for errors or inconsistences.
        /// </summary>
        /// <param name="configuration">The configuration to validate</param>
        public static void ValidateSubscriptions(this IPlatibusConfiguration configuration)
        {
            if (configuration == null)
            {
                return;
            }

            var endpoints         = configuration.Endpoints;
            var subscriptionIndex = 0;

            foreach (var subscription in configuration.Subscriptions)
            {
                var targetEndpointName = subscription.Endpoint;
                if (!endpoints.Contains(targetEndpointName))
                {
                    throw new InvalidSubscriptionException("Subscription [" + subscriptionIndex + "] references unknown endpoint " + targetEndpointName);
                }
                subscriptionIndex++;
            }
        }
        /// <summary>
        /// Checks the specified <paramref name="configuration"/> for omissions, errors, or
        /// inconsistencies.
        /// </summary>
        /// <param name="configuration">The configuration to validate</param>
        public static void Validate(this IPlatibusConfiguration configuration)
        {
            if (configuration == null)
            {
                return;
            }

            if (configuration.MessageNamingService == null)
            {
                throw new ConfigurationErrorsException("Message naming service is required");
            }

            if (configuration.SerializationService == null)
            {
                throw new ConfigurationErrorsException("Serialization service is required");
            }

            configuration.ValidateSendRules();
            configuration.ValidateSubscriptions();
        }
Esempio n. 8
0
        /// <summary>
        /// Initializes a new <see cref="Bus"/> with the specified configuration and services
        /// provided by the host
        /// </summary>
        /// <param name="configuration">The core bus configuration</param>
        /// <param name="baseUri">The base URI provided by the host</param>
        /// <param name="transportService">The transport service provided by the host</param>
        /// <param name="messageQueueingService">The message queueing service provided by the host</param>
        /// <exception cref="ArgumentNullException">Thrown if any of the parameters are <c>null</c></exception>
        public Bus(IPlatibusConfiguration configuration, Uri baseUri, ITransportService transportService, IMessageQueueingService messageQueueingService)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            // Validate the provided configuration and throw exceptions for missing or invalid
            // configurations
            configuration.Validate();

            _baseUri                = baseUri ?? throw new ArgumentNullException(nameof(baseUri));
            _transportService       = transportService ?? throw new ArgumentNullException(nameof(transportService));
            _messageQueueingService = messageQueueingService ?? throw new ArgumentNullException(nameof(messageQueueingService));
            _defaultContentType     = string.IsNullOrWhiteSpace(configuration.DefaultContentType)
                ? "application/json"
                : configuration.DefaultContentType;

            _defaultSendOptions = configuration.DefaultSendOptions ?? new SendOptions();

            _messageMarshaller = new MessageMarshaller(
                configuration.MessageNamingService,
                configuration.SerializationService,
                configuration.DefaultContentType);

            _endpoints     = configuration.Endpoints ?? EndpointCollection.Empty;
            _topics        = configuration.Topics.ToList();
            _sendRules     = configuration.SendRules.ToList();
            _handlingRules = configuration.HandlingRules.ToList();
            _subscriptions = configuration.Subscriptions.ToList();

            _diagnosticService = configuration.DiagnosticService;
            _messageHandler    = new MessageHandler(_messageMarshaller, _diagnosticService);

            _transportService.MessageReceived += OnMessageReceived;

            _replyHub = new MemoryCacheReplyHub(_messageMarshaller, _diagnosticService, TimeSpan.FromMinutes(5));
        }
Esempio n. 9
0
        /// <summary>
        /// Initializes a new <see cref="Bus"/> with the specified configuration and services
        /// provided by the host
        /// </summary>
        /// <param name="configuration">The core bus configuration</param>
        /// <param name="baseUri">The base URI provided by the host</param>
        /// <param name="transportService">The transport service provided by the host</param>
        /// <param name="messageQueueingService">The message queueing service provided by the host</param>
        /// <exception cref="ArgumentNullException">Thrown if any of the parameters are <c>null</c></exception>
        public Bus(IPlatibusConfiguration configuration, Uri baseUri, ITransportService transportService, IMessageQueueingService messageQueueingService)
        {
            if (configuration == null) throw new ArgumentNullException("configuration");
            if (baseUri == null) throw new ArgumentNullException("baseUri");
            if (transportService == null) throw new ArgumentNullException("transportService");
            if (messageQueueingService == null) throw new ArgumentNullException("messageQueueingService");

            _baseUri = baseUri;
            _transportService = transportService;
            _messageQueueingService = messageQueueingService;

            // TODO: Throw configuration exception if message queueing service, message naming
            // service, or serialization service are null

            _messageJournalingService = configuration.MessageJournalingService;
            _messageNamingService = configuration.MessageNamingService;
            _serializationService = configuration.SerializationService;

            _endpoints = new ReadOnlyEndpointCollection(configuration.Endpoints);
            _topics = configuration.Topics.ToList();
            _sendRules = configuration.SendRules.ToList();
            _handlingRules = configuration.HandlingRules.ToList();
            _subscriptions = configuration.Subscriptions.ToList();
        }
 /// <inheritdoc />
 /// <summary>
 /// Initializes a new <see cref="T:Platibus.Journaling.MessageJournalConsumer" /> with the specified configuration
 /// and services
 /// </summary>
 /// <param name="configuration">The bus configuration</param>
 /// <exception cref="T:System.ArgumentNullException">Thrown if any of the parameters are <c>null</c></exception>
 public MessageJournalConsumer(IPlatibusConfiguration configuration) : this(configuration, null)
 {
 }