protected override async Task ProcessQueue(CancellationToken cancellationToken, ReferenceWrapper subscriber, string queueName) { var queue = await TimeoutRetryHelper.Execute((token, state) => StateManager.GetOrAddAsync <IReliableConcurrentQueue <MessageWrapper> >(queueName), cancellationToken : cancellationToken); long messageCount = queue.Count; if (messageCount == 0L) { return; } messageCount = Math.Min(messageCount, MaxDequeuesInOneIteration); LogProvider?.LogMessage($"Processing {messageCount} items from queue {queue.Name} for subscriber: {subscriber.Name}"); for (long i = 0; i < messageCount; i++) { cancellationToken.ThrowIfCancellationRequested(); await StateManager.ExecuteInTransaction(async (tx, token, state) => { var result = await queue.TryDequeueAsync(tx, cancellationToken); if (result.HasValue) { await subscriber.PublishAsync(result.Value); } }, cancellationToken : cancellationToken); } }
/// <summary> /// Sends out queued messages for the provided queue. /// </summary> /// <param name="cancellationToken"></param> /// <param name="subscriber"></param> /// <param name="queueName"></param> /// <returns></returns> private async Task ProcessQueues(CancellationToken cancellationToken, ReferenceWrapper subscriber, string queueName) { var queue = await TimeoutRetryHelper.Execute((token, state) => StateManager.GetOrAddAsync <IReliableQueue <MessageWrapper> >(queueName), cancellationToken : cancellationToken); long messageCount = await TimeoutRetryHelper.ExecuteInTransaction(StateManager, (tx, token, state) => queue.GetCountAsync(tx), cancellationToken : cancellationToken); if (messageCount == 0L) { return; } messageCount = Math.Min(messageCount, MaxDequeuesInOneIteration); ServiceEventSourceMessage($"Processing {messageCount} items from queue {queue.Name} for subscriber: {subscriber.Name}"); for (long i = 0; i < messageCount; i++) { cancellationToken.ThrowIfCancellationRequested(); await TimeoutRetryHelper.ExecuteInTransaction(StateManager, async (tx, token, state) => { var message = await queue.TryDequeueAsync(tx); if (message.HasValue) { await subscriber.PublishAsync(message.Value); } }, cancellationToken : cancellationToken); } }
/// <summary> /// Sends out queued messages for the provided queue. /// </summary> /// <param name="cancellationToken"></param> /// <param name="subscriber"></param> /// <param name="queueName"></param> /// <returns></returns> protected sealed override async Task ProcessQueues(CancellationToken cancellationToken, ReferenceWrapper subscriber, string queueName) { var queue = await TimeoutRetryHelper.Execute((token, state) => StateManager.GetOrAddAsync <IReliableConcurrentQueue <MessageWrapper> >(queueName), cancellationToken : cancellationToken); long messageCount = queue.Count; if (messageCount == 0L) { return; } messageCount = Math.Min(messageCount, MaxDequeuesInOneIteration); ServiceEventSourceMessage($"Processing {messageCount} items from queue {queue.Name} for subscriber: {subscriber.Name}"); for (long i = 0; i < messageCount; i++) { cancellationToken.ThrowIfCancellationRequested(); await TimeoutRetryHelper.ExecuteInTransaction(StateManager, async (tx, token, state) => { var result = await queue.TryDequeueAsync(tx, cancellationToken); if (result.HasValue) { try { await subscriber.PublishAsync(result.Value); await BrokerEventsManager.OnMessageDeliveredAsync(queueName, subscriber, result.Value); } catch (Exception ex) { await BrokerEventsManager.OnMessageDeliveryFailedAsync(queueName, subscriber, result.Value, ex); throw; } } }, cancellationToken : cancellationToken); } }