private async Task PollMessageReceiever(IBatchMessageReceiver receiver) // TODO: Support cancellation { var stopwatch = new Stopwatch(); var messageForwarder = this.destinationConfiguration.MessageForwarderFactory(); while (true) { try { stopwatch.Restart(); var messages = (await receiver.ReceieveMessages(sourceConfiguration.ReceiveBatchSize).ConfigureAwait(false)).ToArray(); logger.Debug($"Received {messages.Length} messages from the source. Took {stopwatch.Elapsed}"); stopwatch.Restart(); var sentMessageTokens = (await messageForwarder.ForwardMessages(messages).ConfigureAwait(false)).ToArray(); logger.Debug($"Forwarded {sentMessageTokens.Length} messages to the destination. Took {stopwatch.Elapsed}"); stopwatch.Restart(); await receiver.CompleteMessages(sentMessageTokens).ConfigureAwait(false); logger.Debug($"Completed {sentMessageTokens.Length} messages at the source. Took {stopwatch.Elapsed}"); metricHandler(new Metric("Forwarded messages", sentMessageTokens.Length)); } catch (Exception e) { logger.Error(e.Message, e); metricHandler(new Metric("Exceptions thrown", 1)); } } }
public async Task Setup() { namespaceConnectionString = Environment.GetEnvironmentVariable("NServiceBus.AzureServiceBusForwarder.ConnectionString", EnvironmentVariableTarget.Process); destinationQueue = GetType().Name; messageForwarder = A.Fake<IMessageForwarder>(); messageReceiver = new QueueBatchMessageReceiver(QueueClient.CreateFromConnectionString(namespaceConnectionString, destinationQueue)); await MessageEntityHelper.CreateQueue(destinationQueue); namespaceManager = NamespaceManager.CreateFromConnectionString(namespaceConnectionString); if (await namespaceManager.TopicExistsAsync(TopicName)) { await namespaceManager.DeleteTopicAsync(TopicName); } await namespaceManager.CreateTopicAsync(TopicName); forwarder = new Forwarder( new ForwarderConfiguration( new ForwarderSourceConfiguration(500, () => messageReceiver), new ForwarderDestinationConfiguration(destinationQueue, () => messageForwarder))); }