コード例 #1
0
 /// <summary>
 /// Initializes a new <see cref="TopicController"/>
 /// </summary>
 /// <param name="subscriptionTrackingService">The subscription tracking service</param>
 /// <param name="topics">The list of defined topics</param>
 /// <param name="authorizationService">(Optional) Used to determine whether
 /// a requestor is authorized to subscribe to a topic</param>
 /// <exception cref="ArgumentNullException">Thrown if <paramref name="subscriptionTrackingService"/>
 /// is <c>null</c></exception>
 public TopicController(ISubscriptionTrackingService subscriptionTrackingService, IEnumerable <TopicName> topics, IAuthorizationService authorizationService = null)
 {
     _subscriptionTrackingService = subscriptionTrackingService ?? throw new ArgumentNullException(nameof(subscriptionTrackingService));
     _authorizationService        = authorizationService;
     _topics = (topics ?? Enumerable.Empty <TopicName>())
               .Where(t => t != null)
               .ToList();
 }
コード例 #2
0
ファイル: TopicController.cs プロジェクト: tdbrian/Platibus
 public TopicController(ISubscriptionTrackingService subscriptionTrackingService, IEnumerable<TopicName> topics)
 {
     if (subscriptionTrackingService == null) throw new ArgumentNullException("subscriptionTrackingService");
     _subscriptionTrackingService = subscriptionTrackingService;
     _topics = (topics ?? Enumerable.Empty<TopicName>())
         .Where(t => t != null)
         .ToList();
 }
コード例 #3
0
        /// <summary>
        /// Initializes a new <see cref="MulticastSubscriptionTrackingService"/> decorating the
        /// specified <paramref name="inner"/> <see cref="ISubscriptionTrackingService"/>
        /// configured to broadcast and consume changes over the multicast group at the specified
        /// <paramref name="groupAddress"/>.
        /// </summary>
        /// <param name="inner">The underlying subscription tracking service used to persist or
        /// maintain subscription state</param>
        /// <param name="groupAddress">The address of the multicast group to join</param>
        /// <param name="port">The local port to bind to</param>
        /// <param name="diagnosticService">(Optional) The service through which diagnostic events
        /// are reported and processed</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="inner"/> or
        /// <paramref name="groupAddress"/> is <c>null</c></exception>
        /// <exception cref="ArgumentException">Thrown if <paramref name="groupAddress"/> does not
        /// specify a compatible <see cref="AddressFamily"/></exception>
        /// <exception cref="SocketException">Thrown if there is an error joining the multicast
        /// group, i.e. due to an invalid multicast address.</exception>
        /// <remarks>
        /// The multicast group <paramref name="groupAddress"/> must be on the 224.0.0/4 subnet
        /// </remarks>
        public MulticastSubscriptionTrackingService(ISubscriptionTrackingService inner, IPAddress groupAddress, int port, IDiagnosticService diagnosticService = null)
        {
            _nodeId            = NodeId.Generate();
            _inner             = inner ?? throw new ArgumentNullException(nameof(inner));
            _groupAddress      = groupAddress ?? throw new ArgumentNullException(nameof(groupAddress));
            _port              = port;
            _diagnosticService = diagnosticService ?? DiagnosticService.DefaultInstance;

            _broadcastClient = new UdpClient
            {
                ExclusiveAddressUse = false
            };
            _broadcastClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            _broadcastClient.JoinMulticastGroup(groupAddress, IPAddress.Any);
            _broadcastClient.Ttl = 2;
            _broadcastClient.Client.Bind(new IPEndPoint(IPAddress.Any, 0));
            var broadcastBinding = (IPEndPoint)_broadcastClient.Client.LocalEndPoint;

            _diagnosticService.Emit(new MulticastEventBuilder(this, MulticastEventType.BroadcastSocketBound)
            {
                Node = _nodeId.ToString(),
                Host = broadcastBinding.Address.ToString(),
                Port = broadcastBinding.Port
            }.Build());

            _listenerClient = new UdpClient
            {
                ExclusiveAddressUse = false
            };
            _listenerClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            _listenerClient.JoinMulticastGroup(groupAddress, IPAddress.Any);
            _listenerClient.Client.Bind(new IPEndPoint(IPAddress.Any, _port));
            var listenerBinding = (IPEndPoint)_listenerClient.Client.LocalEndPoint;

            _diagnosticService.Emit(new MulticastEventBuilder(this, MulticastEventType.ListenerSocketBound)
            {
                Node = _nodeId.ToString(),
                Host = listenerBinding.Address.ToString(),
                Port = listenerBinding.Port
            }.Build());

            _cancellationTokenSource = new CancellationTokenSource();
            _receiveResultQueue      = new ActionBlock <UdpReceiveResult>(HandleReceiveResult,
                                                                          new ExecutionDataflowBlockOptions
            {
                MaxDegreeOfParallelism = 2
            });

            _listenTask = Task.Run(async() => await Listen(_cancellationTokenSource.Token));
            _diagnosticService.Emit(new MulticastEventBuilder(this, MulticastEventType.ListenerStarted)
            {
                Node = _nodeId.ToString(),
                Host = listenerBinding.Address.ToString(),
                Port = listenerBinding.Port
            }.Build());
        }
コード例 #4
0
        /// <summary>
        /// Initializes a new <see cref="MulticastSubscriptionTrackingService"/> based on
        /// the specified <paramref name="configuration"/> and wrapping the supplied
        /// <paramref name="inner"/> subscription tracking service.
        /// </summary>
        /// <param name="configuration">The multicast configuration</param>
        /// <param name="inner">The subscription tracking service that is being wrapped
        /// by the multicast subscription tracking service</param>
        /// <returns></returns>
        public Task <ISubscriptionTrackingService> InitSubscriptionTrackingService(MulticastElement configuration,
                                                                                   ISubscriptionTrackingService inner)
        {
            if (configuration == null || !configuration.Enabled)
            {
                return(Task.FromResult(inner));
            }

            var multicastTrackingService = new MulticastSubscriptionTrackingService(
                inner, configuration.Address, configuration.Port);

            return(Task.FromResult <ISubscriptionTrackingService>(multicastTrackingService));
        }
コード例 #5
0
ファイル: OwinSelfHost.cs プロジェクト: sweetlandj/Platibus
        public async Task StartAsync(string configSectionName, Func <OwinConfiguration, Task> configure = null)
        {
            var serverPath      = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, configSectionName);
            var serverDirectory = new DirectoryInfo(serverPath);

            serverDirectory.Refresh();
            if (serverDirectory.Exists)
            {
                serverDirectory.Delete(true);
            }

            var configuration        = new OwinConfiguration();
            var configurationManager = new OwinConfigurationManager();
            await configurationManager.Initialize(configuration, configSectionName);

#pragma warning disable 612
            await configurationManager.FindAndProcessConfigurationHooks(configuration);

#pragma warning restore 612

            if (configure != null)
            {
                await configure(configuration);
            }

            var baseUri = configuration.BaseUri;
            _subscriptionTrackingService = configuration.SubscriptionTrackingService;
            _messageQueueingService      = configuration.MessageQueueingService;

            var transportServiceOptions = new HttpTransportServiceOptions(baseUri, _messageQueueingService, _subscriptionTrackingService)
            {
                DiagnosticService = configuration.DiagnosticService,
                Endpoints         = configuration.Endpoints,
                MessageJournal    = configuration.MessageJournal,
                BypassTransportLocalDestination = configuration.BypassTransportLocalDestination
            };

            _transportService = new HttpTransportService(transportServiceOptions);

            var bus = new Bus(configuration, baseUri, _transportService, _messageQueueingService);
            _transportService.MessageReceived += (sender, args) => bus.HandleMessage(args.Message, args.Principal);

            await _transportService.Init();

            await bus.Init();

            Bus = bus;

            _middleware = new PlatibusMiddleware(configuration, bus, _transportService);
            _webapp     = WebApp.Start(baseUri.ToString(), app => app.UsePlatibusMiddleware(_middleware));
        }
コード例 #6
0
 public HttpTransportService(Uri baseUri, IEndpointCollection endpoints,
                             IMessageQueueingService messageQueueingService, IMessageJournal messageJournal,
                             ISubscriptionTrackingService subscriptionTrackingService,
                             bool bypassTransportLocalDestination = false,
                             IDiagnosticService diagnosticService = null)
     : this(new HttpTransportServiceOptions(baseUri, messageQueueingService, subscriptionTrackingService)
 {
     DiagnosticService = diagnosticService,
     Endpoints = endpoints,
     MessageJournal = messageJournal,
     BypassTransportLocalDestination = bypassTransportLocalDestination,
     HttpClientFactory = new BasicHttpClientFactory()
 })
 {
 }
コード例 #7
0
        public HttpTransportService(Uri baseUri, IEndpointCollection endpoints, IMessageQueueingService messageQueueingService, IMessageJournalingService messageJournalingService, ISubscriptionTrackingService subscriptionTrackingService)
        {
            if (baseUri == null) throw new ArgumentNullException("baseUri");
            if (messageQueueingService == null) throw new ArgumentNullException("messageQueueingService");
            if (subscriptionTrackingService == null) throw new ArgumentNullException("subscriptionTrackingService");

            _baseUri = baseUri;
            _endpoints = endpoints == null
                ? ReadOnlyEndpointCollection.Empty
                : new ReadOnlyEndpointCollection(endpoints);

            _messageQueueingService = messageQueueingService;
            _messageJournalingService = messageJournalingService;
            _subscriptionTrackingService = subscriptionTrackingService;
            _outboundQueueName = "Outbound";
        }
コード例 #8
0
        private HttpServer(IHttpServerConfiguration configuration)
        {
            _baseUri = configuration.BaseUri;

            _metricsCollector  = new HttpMetricsCollector();
            _diagnosticService = configuration.DiagnosticService;
            _diagnosticService.AddSink(_metricsCollector);

            _subscriptionTrackingService = configuration.SubscriptionTrackingService;
            _messageQueueingService      = configuration.MessageQueueingService;
            _messageJournal = configuration.MessageJournal;

            var transportServiceOptions = new HttpTransportServiceOptions(_baseUri, _messageQueueingService, _subscriptionTrackingService)
            {
                DiagnosticService = configuration.DiagnosticService,
                Endpoints         = configuration.Endpoints,
                MessageJournal    = configuration.MessageJournal,
                BypassTransportLocalDestination = configuration.BypassTransportLocalDestination
            };

            TransportService = new HttpTransportService(transportServiceOptions);

            _bus = new Bus(configuration, _baseUri, TransportService, _messageQueueingService);

            var authorizationService = configuration.AuthorizationService;

            _resourceRouter = new ResourceTypeDictionaryRouter(configuration.BaseUri)
            {
                { "message", new MessageController(TransportService.ReceiveMessage, authorizationService) },
                { "topic", new TopicController(_subscriptionTrackingService, configuration.Topics, authorizationService) },
                { "journal", new JournalController(configuration.MessageJournal, configuration.AuthorizationService) },
                { "metrics", new MetricsController(_metricsCollector) }
            };
            _httpListener = InitHttpListener(_baseUri, configuration.AuthenticationSchemes);

            var acceptBlockOptions = new ExecutionDataflowBlockOptions
            {
                CancellationToken = _cancellationTokenSource.Token
            };

            if (configuration.ConcurrencyLimit > 0)
            {
                acceptBlockOptions.MaxDegreeOfParallelism = configuration.ConcurrencyLimit;
            }

            _acceptBlock = new ActionBlock <HttpListenerContext>(async ctx => await Accept(ctx), acceptBlockOptions);
        }
コード例 #9
0
        /// <summary>
        /// Initializes a new <see cref="MulticastSubscriptionTrackingService"/> based on
        /// the specified <paramref name="configuration"/> and wrapping the supplied
        /// <paramref name="inner"/> subscription tracking service.
        /// </summary>
        /// <param name="configuration">The multicast configuration</param>
        /// <param name="inner">The subscription tracking service that is being wrapped
        /// by the multicast subscription tracking service</param>
        /// <returns></returns>
        public Task <ISubscriptionTrackingService> InitSubscriptionTrackingService(IConfiguration configuration,
                                                                                   ISubscriptionTrackingService inner)
        {
            var multicastSection = configuration?.GetSection("multicast");
            var multicastEnabled = multicastSection?.GetValue <bool>("enabled") ?? false;

            if (!multicastEnabled)
            {
                return(Task.FromResult(inner));
            }

            var ipAddress = multicastSection.GetValue("address", IPAddress.Parse(MulticastDefaults.Address));
            var port      = multicastSection.GetValue("port", MulticastDefaults.Port);
            var multicastTrackingService = new MulticastSubscriptionTrackingService(inner, ipAddress, port);

            return(Task.FromResult <ISubscriptionTrackingService>(multicastTrackingService));
        }
コード例 #10
0
ファイル: BusManager.cs プロジェクト: tdbrian/Platibus
 private async Task Init(CancellationToken cancellationToken = default(CancellationToken))
 {
     _configuration = await IISConfigurationManager.LoadConfiguration();
     _baseUri = _configuration.BaseUri;
     _subscriptionTrackingService = _configuration.SubscriptionTrackingService;
     _messageQueueingService = _configuration.MessageQueueingService;
     _messageJournalingService = _configuration.MessageJournalingService;
     var endpoints = _configuration.Endpoints;
     _transportService = new HttpTransportService(_baseUri, endpoints, _messageQueueingService, _messageJournalingService, _subscriptionTrackingService);
     _bus = new Bus(_configuration, _baseUri, _transportService, _messageQueueingService);
     await _transportService.Init(cancellationToken);
     await _bus.Init(cancellationToken);
     _resourceRouter = new ResourceTypeDictionaryRouter
     {
         {"message", new MessageController(_bus.HandleMessage)},
         {"topic", new TopicController(_subscriptionTrackingService, _configuration.Topics)}
     };
 }
コード例 #11
0
        /// <summary>
        /// Initializes a new <see cref="HttpTransportService"/>
        /// </summary>
        /// <param name="options">The HTTP transport service configuration</param>
        public HttpTransportService(HttpTransportServiceOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            _baseUri   = options.BaseUri.WithTrailingSlash();
            _endpoints = options.Endpoints = options.Endpoints ?? EndpointCollection.Empty;

            _messageQueueingService          = options.MessageQueueingService;
            _messageJournal                  = options.MessageJournal;
            _subscriptionTrackingService     = options.SubscriptionTrackingService;
            _bypassTransportLocalDestination = options.BypassTransportLocalDestination;
            _diagnosticService               = options.DiagnosticService ?? DiagnosticService.DefaultInstance;
            _httpClientFactory               = options.HttpClientFactory ?? new BasicHttpClientFactory();
            _outboundQueueName               = "Outbound";
        }
コード例 #12
0
ファイル: ManagedBus.cs プロジェクト: sweetlandj/Platibus
        /// <summary>
        /// Initializes a new <see cref="ManagedBus"/> with the specified <paramref name="configuration"/>
        /// </summary>
        /// <param name="configuration">The configuration used to initialize the bus instance
        /// and its related components</param>
        public ManagedBus(IIISConfiguration configuration)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }
            var baseUri = configuration.BaseUri;

            _subscriptionTrackingService = configuration.SubscriptionTrackingService;
            _messageQueueingService      = configuration.MessageQueueingService;
            _messageJournal = configuration.MessageJournal;

            var transportServiceOptions = new HttpTransportServiceOptions(baseUri, _messageQueueingService, _subscriptionTrackingService)
            {
                DiagnosticService = configuration.DiagnosticService,
                Endpoints         = configuration.Endpoints,
                MessageJournal    = configuration.MessageJournal,
                BypassTransportLocalDestination = configuration.BypassTransportLocalDestination
            };

            TransportService = new HttpTransportService(transportServiceOptions);

            Bus = InitBus(configuration, TransportService, _messageQueueingService).GetResultFromCompletionSource();
        }
コード例 #13
0
ファイル: HttpServer.cs プロジェクト: tdbrian/Platibus
        private HttpServer(IHttpServerConfiguration configuration)
        {
            _baseUri = configuration.BaseUri;
            _subscriptionTrackingService = configuration.SubscriptionTrackingService;
            _messageQueueingService = configuration.MessageQueueingService;
            _messageJournalingService = configuration.MessageJournalingService;
            var endpoints = configuration.Endpoints;
            _transportService = new HttpTransportService(_baseUri, endpoints, _messageQueueingService, _messageJournalingService, _subscriptionTrackingService);
            _bus = new Bus(configuration, _baseUri, _transportService, _messageQueueingService);

            _resourceRouter = new ResourceTypeDictionaryRouter
            {
                {"message", new MessageController(_bus.HandleMessage)},
                {"topic", new TopicController(_subscriptionTrackingService, configuration.Topics)}
            };
            _httpListener = InitHttpListener(_baseUri, configuration.AuthenticationSchemes);
        }
コード例 #14
0
 /// <summary>
 /// Initializes a new set of <see cref="HttpTransportServiceOptions"/>
 /// </summary>
 /// <param name="baseUri">The base URI of the application</param>
 /// <param name="messageQueueingService">The message queueing service used
 /// to queue outbound messages</param>
 /// <param name="subscriptionTrackingService">The subscription tracking service</param>
 public HttpTransportServiceOptions(Uri baseUri, IMessageQueueingService messageQueueingService, ISubscriptionTrackingService subscriptionTrackingService)
 {
     BaseUri = baseUri ?? throw new ArgumentNullException(nameof(baseUri));
     MessageQueueingService      = messageQueueingService ?? throw new ArgumentNullException(nameof(messageQueueingService));
     SubscriptionTrackingService = subscriptionTrackingService ?? throw new ArgumentNullException(nameof(subscriptionTrackingService));
 }