Example #1
0
        public async Task ChangeConcurrency(PushRuntimeSettings newLimitations, CancellationToken cancellationToken = default)
        {
            await StopReceive(cancellationToken).ConfigureAwait(false);

            limitations = newLimitations;
            await StartReceive(cancellationToken).ConfigureAwait(false);
        }
Example #2
0
 public void Start(PushRuntimeSettings limitations)
 {
     if (throwCritical)
     {
         criticalError.Raise(exceptionToThrow.Message, exceptionToThrow);
     }
 }
        public void Start(PushRuntimeSettings limitations)
        {
            var definition = topologySectionManager.DetermineReceiveResources(inputQueue);

            throttler = new SemaphoreSlim(limitations.MaxConcurrency);
            topologyOperator.Start(definition, limitations.MaxConcurrency);
        }
        public async Task Initialize(PushRuntimeSettings limitations, OnMessage onMessage, OnError onError, CancellationToken cancellationToken = default)
        {
            this.limitations = limitations;
            messageReceivingCancellationTokenSource  = new CancellationTokenSource();
            messageProcessingCancellationTokenSource = new CancellationTokenSource();

            processStrategy = processStrategyFactory(transport.TransportTransactionMode);

            messageReceivingCircuitBreaker  = new RepeatedFailuresOverTimeCircuitBreaker("message receiving", waitTimeCircuitBreaker, ex => hostSettings.CriticalErrorAction("Failed to peek " + receiveSettings.ReceiveAddress, ex, messageProcessingCancellationTokenSource.Token));
            messageProcessingCircuitBreaker = new RepeatedFailuresOverTimeCircuitBreaker("message processing", waitTimeCircuitBreaker, ex => hostSettings.CriticalErrorAction("Failed to receive from " + receiveSettings.ReceiveAddress, ex, messageProcessingCancellationTokenSource.Token));

            inputQueue = queueFactory(receiveSettings.ReceiveAddress);
            errorQueue = queueFactory(receiveSettings.ErrorQueue);

            processStrategy.Init(inputQueue, errorQueue, onMessage, onError, hostSettings.CriticalErrorAction);

            if (transport.ExpiredMessagesPurger.PurgeOnStartup)
            {
                try
                {
                    var purgedRowsCount = await queuePurger.Purge(inputQueue, cancellationToken).ConfigureAwait(false);

                    Logger.InfoFormat("{0:N0} messages purged from queue {1}", purgedRowsCount, receiveSettings.ReceiveAddress);
                }
                catch (Exception ex) when(!ex.IsCausedBy(cancellationToken))
                {
                    Logger.Warn("Failed to purge input queue on startup.", ex);
                }
            }

            await PurgeExpiredMessages(cancellationToken).ConfigureAwait(false);

            await schemaInspector.PerformInspection(inputQueue, cancellationToken).ConfigureAwait(false);
        }
Example #5
0
 public void Start(PushRuntimeSettings limitations)
 {
     if (throwCritical)
     {
         criticalError.Raise(exceptionToThrow.Message, exceptionToThrow);
     }
 }
Example #6
0
 public void Start(PushRuntimeSettings limitations)
 {
     if (throwCritical != null)
     {
         criticalError.Raise(throwCritical.Message, throwCritical);
     }
 }
 public Task ChangeConcurrency(PushRuntimeSettings limitations, CancellationToken cancellationToken = default)
 {
     maxConcurrency = limitations.MaxConcurrency;
     Logger.InfoFormat("Calling a change concurrency and reconnecting with new value {0}.", limitations.MaxConcurrency);
     _ = Task.Run(() => Reconnect(), cancellationToken);
     return(Task.CompletedTask);
 }
 public Configuration(LogicalAddress logicalAddress,
                      string queueNameBase,
                      string localAddress,
                      string instanceSpecificQueue,
                      TransportTransactionMode transactionMode,
                      PushRuntimeSettings pushRuntimeSettings,
                      bool purgeOnStartup,
                      Notification <ReceivePipelineCompleted> pipelineCompletedSubscribers,
                      bool isSendOnlyEndpoint,
                      List <Type> executeTheseHandlersFirst,
                      MessageHandlerRegistry messageHandlerRegistry,
                      bool createQueues, TransportSeam transportSeam)
 {
     LogicalAddress               = logicalAddress;
     QueueNameBase                = queueNameBase;
     LocalAddress                 = localAddress;
     InstanceSpecificQueue        = instanceSpecificQueue;
     TransactionMode              = transactionMode;
     PushRuntimeSettings          = pushRuntimeSettings;
     PurgeOnStartup               = purgeOnStartup;
     IsSendOnlyEndpoint           = isSendOnlyEndpoint;
     PipelineCompletedSubscribers = pipelineCompletedSubscribers;
     ExecuteTheseHandlersFirst    = executeTheseHandlersFirst;
     satelliteDefinitions         = new List <SatelliteDefinition>();
     this.messageHandlerRegistry  = messageHandlerRegistry;
     CreateQueues                 = createQueues;
     this.transportSeam           = transportSeam;
 }
        public Task Initialize(PushRuntimeSettings limitations, OnMessage onMessage, OnError onError, CancellationToken cancellationToken = default)
        {
            var inputAddress = MsmqAddress.Parse(receiveSettings.ReceiveAddress);
            var errorAddress = MsmqAddress.Parse(receiveSettings.ErrorQueue);

            if (!string.Equals(inputAddress.Machine, RuntimeEnvironment.MachineName,
                               StringComparison.OrdinalIgnoreCase))
            {
                throw new Exception(
                          $"MSMQ Dequeuing can only run against the local machine. Invalid inputQueue name '{receiveSettings.ReceiveAddress}'.");
            }

            inputQueue = new MessageQueue(inputAddress.FullPath, false, true, QueueAccessMode.Receive);
            errorQueue = new MessageQueue(errorAddress.FullPath, false, true, QueueAccessMode.Send);

            if (transportSettings.TransportTransactionMode != TransportTransactionMode.None && !QueueIsTransactional())
            {
                throw new ArgumentException(
                          $"Queue must be transactional if you configure the endpoint to be transactional ({receiveSettings.ReceiveAddress}).");
            }

            inputQueue.MessageReadPropertyFilter = DefaultReadPropertyFilter;

            if (receiveSettings.PurgeOnStartup)
            {
                inputQueue.Purge();
            }

            receiveStrategy = receiveStrategyFactory(transportSettings.TransportTransactionMode);
            receiveStrategy.Init(inputQueue, errorQueue, onMessage, onError, criticalErrorAction, transportSettings.IgnoreIncomingTimeToBeReceivedHeaders);

            maxConcurrency     = limitations.MaxConcurrency;
            concurrencyLimiter = new SemaphoreSlim(limitations.MaxConcurrency, limitations.MaxConcurrency);
            return(Task.CompletedTask);
        }
Example #10
0
        public void Start(PushRuntimeSettings limitations)
        {
            maxConcurrency = limitations.MaxConcurrency;

            var prefetchCount = maxConcurrency * prefetchMultiplier;

            if (overriddenPrefetchCount.HasValue)
            {
                prefetchCount = overriddenPrefetchCount.Value;
            }

            var receiveMode = pushSettings.RequiredTransactionMode == TransportTransactionMode.None ? ReceiveMode.ReceiveAndDelete : ReceiveMode.PeekLock;

            if (tokenProvider == null)
            {
                receiver = new MessageReceiver(connectionStringBuilder.GetNamespaceConnectionString(), pushSettings.InputQueue, receiveMode, retryPolicy: retryPolicy, prefetchCount);
            }
            else
            {
                receiver = new MessageReceiver(connectionStringBuilder.Endpoint, pushSettings.InputQueue, tokenProvider, connectionStringBuilder.TransportType, receiveMode, retryPolicy: retryPolicy, prefetchCount);
            }

            semaphore = new SemaphoreSlim(maxConcurrency, maxConcurrency);

            messageProcessing = new CancellationTokenSource();

            receiveLoopTask = Task.Run(() => ReceiveLoop());
        }
Example #11
0
 private void HydrateFields(PushRuntimeSettings pushRuntimeSettings)
 {
     _runningReceiveTasks     = new ConcurrentDictionary <Task, Task>();
     _concurrencyLimiter      = new SemaphoreSlim(pushRuntimeSettings.MaxConcurrency);
     _cancellationTokenSource = new CancellationTokenSource();
     _cancellationToken       = _cancellationTokenSource.Token;
 }
Example #12
0
 public SatelliteDefinition(string name, string receiveAddress, PushRuntimeSettings runtimeSettings, Func <RecoverabilityConfig, ErrorContext, RecoverabilityAction> recoverabilityPolicy, OnSatelliteMessage onMessage)
 {
     Name                 = name;
     ReceiveAddress       = receiveAddress;
     RuntimeSettings      = runtimeSettings;
     RecoverabilityPolicy = recoverabilityPolicy;
     OnMessage            = onMessage;
 }
 public void Start(PushRuntimeSettings limitations)
 {
     // The LimitMessageProcessingConcurrencyTo setting only applies to the input queue
     if (pushSettings.InputQueue == Conventions.EndpointNamingConvention(typeof(ThrottledEndpoint)))
     {
         Assert.AreEqual(10, limitations.MaxConcurrency);
     }
 }
        public void Start(PushRuntimeSettings limitations)
        {
            logger.Info($"Starting MessagePump for {this.messagePumpName}");

            this.queue              = session.GetQueue(this.nsbSettings.InputQueue);
            this.consumer           = session.CreateConsumer(queue);
            this.consumer.Listener += HandleConsumerMessage;
        }
 public void Start(PushRuntimeSettings limitations)
 {
     // The LimitMessageProcessingConcurrencyTo setting only applies to the input queue
     if (pushSettings.InputQueue == Conventions.EndpointNamingConvention(typeof(ThrottledEndpoint)))
     {   
         Assert.AreEqual(10, limitations.MaxConcurrency);
     }
 }
            public void Start(PushRuntimeSettings limitations)
            {
                if (ThrowOnStart)
                {
                    throw new InvalidOperationException();
                }

                Started = true;
            }
Example #17
0
 public SatelliteDefinition(string name, string receiveAddress, TransportTransactionMode requiredTransportTransactionMode, PushRuntimeSettings runtimeSettings, Func <RecoverabilityConfig, ErrorContext, RecoverabilityAction> recoverabilityPolicy, Func <IBuilder, MessageContext, Task> onMessage)
 {
     Name           = name;
     ReceiveAddress = receiveAddress;
     RequiredTransportTransactionMode = requiredTransportTransactionMode;
     RuntimeSettings      = runtimeSettings;
     RecoverabilityPolicy = recoverabilityPolicy;
     OnMessage            = onMessage;
 }
 public SatelliteDefinition(string name, string receiveAddress, TransportTransactionMode requiredTransportTransactionMode, PushRuntimeSettings runtimeSettings, Func<RecoverabilityConfig, ErrorContext, RecoverabilityAction> recoverabilityPolicy, Func<IBuilder, MessageContext, Task> onMessage)
 {
     Name = name;
     ReceiveAddress = receiveAddress;
     RequiredTransportTransactionMode = requiredTransportTransactionMode;
     RuntimeSettings = runtimeSettings;
     RecoverabilityPolicy = recoverabilityPolicy;
     OnMessage = onMessage;
 }
Example #19
0
        public void Start(PushRuntimeSettings limitations)
        {
            cancellationTokenSource = new CancellationTokenSource();
            maxConcurrency          = limitations.MaxConcurrency;

            int numberOfPumps;

            if (maxConcurrency <= 10)
            {
                numberOfPumps           = 1;
                numberOfMessagesToFetch = maxConcurrency;
            }
            else
            {
                numberOfMessagesToFetch = 10;
                numberOfPumps           = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(maxConcurrency) / numberOfMessagesToFetch));
            }

            receiveMessagesRequest = new ReceiveMessageRequest
            {
                MaxNumberOfMessages = numberOfMessagesToFetch,
                QueueUrl            = queueUrl,
                WaitTimeSeconds     = 20,
                AttributeNames      = new List <string> {
                    "SentTimestamp"
                },
                MessageAttributeNames = new List <string> {
                    Headers.MessageId
                }
            };

            maxConcurrencySemaphore = new SemaphoreSlim(maxConcurrency);
            pumpTasks = new List <Task>(numberOfPumps);

            for (var i = 0; i < numberOfPumps; i++)
            {
                pumpTasks.Add(Task.Run(() => ConsumeMessages(cancellationTokenSource.Token), CancellationToken.None));
            }

            if (configuration.IsDelayedDeliveryEnabled)
            {
                var receiveDelayedMessagesRequest = new ReceiveMessageRequest
                {
                    MaxNumberOfMessages = 10,
                    QueueUrl            = delayedDeliveryQueueUrl,
                    WaitTimeSeconds     = 20,
                    AttributeNames      = new List <string> {
                        "MessageDeduplicationId", "SentTimestamp", "ApproximateFirstReceiveTimestamp", "ApproximateReceiveCount"
                    },
                    MessageAttributeNames = new List <string> {
                        "All"
                    }
                };

                pumpTasks.Add(Task.Run(() => ConsumeDelayedMessages(receiveDelayedMessagesRequest, cancellationTokenSource.Token), CancellationToken.None));
            }
        }
        public void Start(PushRuntimeSettings limitations)
        {
            settings.Get <FakeTransport.StartUpSequence>().Add($"{nameof(IPushMessages)}.{nameof(Start)}");

            if (throwCritical)
            {
                criticalError.Raise(exceptionToThrow.Message, exceptionToThrow);
            }
        }
Example #21
0
        public void Start(PushRuntimeSettings limitations)
        {
            poller = Task.Run(async() =>
            {
                using (var repo = new Repository($"../../../../{endpointName}", null))
                {
                    while (!tokenSource.IsCancellationRequested)
                    {
                        PullOptions options = new PullOptions
                        {
                            FetchOptions = new FetchOptions
                            {
                                CredentialsProvider = (url, usernameFromUrl, types) =>
                                                      new UsernamePasswordCredentials
                                {
                                    Username = "******",
                                    Password = "******"
                                }
                            }
                        };
                        repo.Network.Pull(new Signature("daniel", "daniel", new DateTimeOffset(DateTime.Now)),
                                          options);

                        foreach (var commit in repo.Commits)
                        {
                            if (!alreadyPushedCommits.Contains(commit.Id.Sha))
                            {
                                using (var stream = new MemoryStream())
                                    using (var writer = new StreamWriter(stream))
                                    {
                                        var headers = commit.Message
                                                      .Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries)
                                                      .Select(
                                            kvp => kvp.Split(new[] { " = " }, StringSplitOptions.RemoveEmptyEntries))
                                                      .Select(kvp => new { Key = kvp[0], Value = kvp[1] })
                                                      .ToDictionary(x => x.Key, x => x.Value);

                                        var treeEntry = commit.Tree.FirstOrDefault(x => x.Name.EndsWith(".payload"));
                                        if (treeEntry != null)
                                        {
                                            await writer.WriteAsync(File.ReadAllText(treeEntry.Path)).ConfigureAwait(false);
                                        }

                                        await stream.FlushAsync().ConfigureAwait(false);
                                        stream.Position = 0;

                                        var pushContext = new PushContext(commit.Id.Sha, headers, stream,
                                                                          new NoOpTransaction(), new ContextBag(null));
                                        await pipe(pushContext);
                                        alreadyPushedCommits.Add(commit.Id.Sha);
                                    }
                            }
                        }
                    }
                }
            });
        }
Example #22
0
            public void Start(PushRuntimeSettings limitations)
            {
                if (ThrowOnStart)
                {
                    throw new InvalidOperationException();
                }

                Started = true;
            }
 public Task Initialize(PushRuntimeSettings limitations, OnMessage onMessage, OnError onError,
                        CancellationToken cancellationToken)
 {
     this.onMessage = onMessage;
     this.onError   = onError;
     return(baseTransportReceiver?.Initialize(limitations,
                                              (_, __) => Task.CompletedTask,
                                              (_, __) => Task.FromResult(ErrorHandleResult.Handled),
                                              cancellationToken) ?? Task.CompletedTask);
 }
Example #24
0
        public void Start(PushRuntimeSettings limitations)
        {
            runningReceiveTasks     = new ConcurrentDictionary <Task, Task>();
            concurrencyLimiter      = new SemaphoreSlim(limitations.MaxConcurrency);
            cancellationTokenSource = new CancellationTokenSource();

            cancellationToken = cancellationTokenSource.Token;

            messagePumpTask = Task.Run(ProcessMessages, CancellationToken.None);
        }
        public void Start(PushRuntimeSettings limitations)
        {
            runningReceiveTasks     = new ConcurrentDictionary <Task, Task>();
            concurrencyLimiter      = new SemaphoreSlim(limitations.MaxConcurrency);
            cancellationTokenSource = new CancellationTokenSource();

            cancellationToken = cancellationTokenSource.Token;

            subscription = connection.ConnectToPersistentSubscription(inputQueue, inputQueue, OnEvent, SubscriptionDropped, autoAck: false);
        }
        /// <summary>
        /// Adds a new satellite receiver.
        /// </summary>
        /// <param name="name">Name of the satellite.</param>
        /// <param name="runtimeSettings">Transport runtime settings.</param>
        /// <param name="onMessage">The message func.</param>
        /// <param name="transportAddress">The autogenerated transport address to listen on.</param>
        /// <param name="recoverabilityPolicy">Recoverability policy to be if processing fails.</param>
        public void AddSatelliteReceiver(string name, string transportAddress, PushRuntimeSettings runtimeSettings, Func <RecoverabilityConfig, ErrorContext, RecoverabilityAction> recoverabilityPolicy, Func <IBuilder, MessageContext, Task> onMessage)
        {
            var requiredTransactionMode = Settings.GetRequiredTransactionModeForReceives();

            var satelliteDefinition = new SatelliteDefinition(name, transportAddress, requiredTransactionMode, runtimeSettings, recoverabilityPolicy, onMessage);

            Settings.Get <SatelliteDefinitions>().Add(satelliteDefinition);

            Settings.Get <QueueBindings>().BindReceiving(transportAddress);
        }
        public Task Initialize(PushRuntimeSettings limitations, OnMessage onMessage, OnError onError, CancellationToken cancellationToken = default)
        {
            this.limitations = limitations;

            Logger.Debug($"Initializing MessageReceiver {Id}");

            receiveStrategy = ReceiveStrategy.BuildReceiveStrategy(onMessage, onError, requiredTransactionMode, criticalErrorAction);

            return(azureMessageQueueReceiver.Init(receiveAddress, errorQueue, cancellationToken));
        }
Example #28
0
        public void Start(PushRuntimeSettings limitations)
        {
            messageProcessing = new CancellationTokenSource();

            maxConcurrency = limitations.MaxConcurrency;
            semaphore      = new SemaphoreSlim(limitations.MaxConcurrency, limitations.MaxConcurrency);

            Parallel.ForEach(consumerHolderList, ch => ch.Init(messageProcessing));
            Parallel.ForEach(consumerHolderList, ch => ch.Start(limitations));
        }
        /// <summary>
        /// Adds a new satellite receiver.
        /// </summary>
        /// <param name="name">Name of the satellite.</param>
        /// <param name="runtimeSettings">Transport runtime settings.</param>
        /// <param name="onMessage">The message func.</param>
        /// <param name="transportAddress">The autogenerated transport address to listen on.</param>
        /// <param name="recoverabilityPolicy">Recoverability policy to be if processing fails.</param>
        public void AddSatelliteReceiver(string name, string transportAddress, PushRuntimeSettings runtimeSettings, Func <RecoverabilityConfig, ErrorContext, RecoverabilityAction> recoverabilityPolicy, Func <IServiceProvider, MessageContext, Task> onMessage)
        {
            Guard.AgainstNullAndEmpty(nameof(name), name);
            Guard.AgainstNullAndEmpty(nameof(transportAddress), transportAddress);
            Guard.AgainstNull(nameof(runtimeSettings), runtimeSettings);
            Guard.AgainstNull(nameof(recoverabilityPolicy), recoverabilityPolicy);
            Guard.AgainstNull(nameof(onMessage), onMessage);

            Receiving.AddSatelliteReceiver(name, transportAddress, runtimeSettings, recoverabilityPolicy, onMessage);
        }
Example #30
0
        public void Start(PushRuntimeSettings limitations)
        {
            inputQueue.FormatPeekCommand(Math.Min(100, 10 * limitations.MaxConcurrency));
            runningReceiveTasks     = new ConcurrentDictionary <Task, Task>();
            concurrencyLimiter      = new SemaphoreSlim(limitations.MaxConcurrency);
            cancellationTokenSource = new CancellationTokenSource();

            cancellationToken = cancellationTokenSource.Token;

            messagePumpTask = Task.Run(ProcessMessages, CancellationToken.None);
        }
Example #31
0
 public void Start(PushRuntimeSettings limitations)
 {
     SimpleSubscriber.CreateAsync(subscriptionName)
     .ContinueWith(async t =>
     {
         var s = await t.ConfigureAwait(false);
         await s.StartAsync(Consume)
         .ConfigureAwait(false);
         subscriber = s;
     });
 }
        public void Start(PushRuntimeSettings limitations)
        {
            inputQueue.FormatPeekCommand(queuePeekerOptions.MaxRecordsToPeek ?? Math.Min(100, 10 * limitations.MaxConcurrency));
            maxConcurrency          = limitations.MaxConcurrency;
            concurrencyLimiter      = new SemaphoreSlim(limitations.MaxConcurrency);
            cancellationTokenSource = new CancellationTokenSource();

            cancellationToken = cancellationTokenSource.Token;

            messagePumpTask = Task.Run(ProcessMessages, CancellationToken.None);
        }
        public void Start(PushRuntimeSettings limitations)
        {
            cancellationTokenSource = new CancellationTokenSource();

            inputQueuePump.Start(limitations.MaxConcurrency, cancellationTokenSource.Token);

            if (configuration.IsDelayedDeliveryEnabled)
            {
                delayedMessagesPump.Start(cancellationTokenSource.Token);
            }
        }
        public void Start(PushRuntimeSettings limitations)
        {
            _cancellationTokenSource = new CancellationTokenSource();
            _concurrencyLevel        = limitations.MaxConcurrency;
            _maxConcurrencySempahore = new SemaphoreSlim(_concurrencyLevel);
            _consumerTasks           = new List <Task>();

            for (var i = 0; i < _concurrencyLevel; i++)
            {
                _consumerTasks.Add(ConsumeMessages());
            }
        }
Example #35
0
        public void Start(PushRuntimeSettings limitations)
        {
            MessageQueue.ClearConnectionCache();

            runningReceiveTasks = new ConcurrentDictionary<Task, Task>();
            concurrencyLimiter = new SemaphoreSlim(limitations.MaxConcurrency);
            cancellationTokenSource = new CancellationTokenSource();

            cancellationToken = cancellationTokenSource.Token;
            // ReSharper disable once ConvertClosureToMethodGroup
            // LongRunning is useless combined with async/await
            messagePumpTask = Task.Run(() => ProcessMessages(), CancellationToken.None);
        }
    public void Start(PushRuntimeSettings limitations)
    {
        runningReceiveTasks = new ConcurrentDictionary<Task, Task>();
        concurrencyLimiter = new SemaphoreSlim(limitations.MaxConcurrency);
        cancellationTokenSource = new CancellationTokenSource();

        cancellationToken = cancellationTokenSource.Token;

        if (purgeOnStartup)
        {
            Directory.Delete(path, true);
            Directory.CreateDirectory(path);
        }

        messagePumpTask = Task.Factory
            .StartNew(ProcessMessages, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default)
            .Unwrap();
    }
        public TransportReceiver(
            string id,
            IPushMessages pushMessages,
            PushSettings pushSettings,
            PushRuntimeSettings pushRuntimeSettings,
            IPipelineExecutor pipelineExecutor,
            RecoverabilityExecutor recoverabilityExecutor,
            CriticalError criticalError)
        {
            this.criticalError = criticalError;
            Id = id;
            this.pushRuntimeSettings = pushRuntimeSettings;
            this.pipelineExecutor = pipelineExecutor;
            this.recoverabilityExecutor = recoverabilityExecutor;
            this.pushSettings = pushSettings;

            receiver = pushMessages;
        }
Example #38
0
        static string SetupDispatcherSatellite(FeatureConfigurationContext context, TransportTransactionMode requiredTransactionSupport, PushRuntimeSettings pushRuntimeSettings)
        {
            var satelliteLogicalAddress = context.Settings.LogicalAddress().CreateQualifiedAddress("TimeoutsDispatcher");
            var satelliteAddress = context.Settings.GetTransportAddress(satelliteLogicalAddress);

            context.AddSatelliteReceiver("Timeout Dispatcher Processor", satelliteAddress, requiredTransactionSupport, pushRuntimeSettings, RecoverabilityPolicy,
                (builder, pushContext) =>
                {
                    var dispatchBehavior = new DispatchTimeoutBehavior(
                        builder.Build<IDispatchMessages>(),
                        builder.Build<IPersistTimeouts>(),
                        requiredTransactionSupport);

                    return dispatchBehavior.Invoke(pushContext);
                });

            return satelliteAddress;
        }
Example #39
0
        static void SetupStorageSatellite(FeatureConfigurationContext context, TransportTransactionMode requiredTransactionSupport, PushRuntimeSettings pushRuntimeSettings)
        {
            var satelliteLogicalAddress = context.Settings.LogicalAddress().CreateQualifiedAddress("Timeouts");
            var satelliteAddress = context.Settings.GetTransportAddress(satelliteLogicalAddress);

            context.AddSatelliteReceiver("Timeout Message Processor", satelliteAddress, requiredTransactionSupport, pushRuntimeSettings, RecoverabilityPolicy,
                (builder, pushContext) =>
                {
                    var storeBehavior = new StoreTimeoutBehavior(
                        builder.Build<ExpiredTimeoutsPoller>(),
                        builder.Build<IDispatchMessages>(),
                        builder.Build<IPersistTimeouts>(),
                        context.Settings.EndpointName().ToString());

                    return storeBehavior.Invoke(pushContext);
                });

            context.Settings.Get<TimeoutManagerAddressConfiguration>().Set(satelliteAddress);
        }
 public void Start(PushRuntimeSettings limitations)
 {
     throw new NotImplementedException();
 }