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++; } }
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(); }
/// <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)); }
/// <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) { }