コード例 #1
0
        private async Task DispatchEvents(CancellationToken token)
        {
            bool more;

            do
            {
                more = TryDispatchEventBatch();

                circuitBreaker.Success();

                if (more && !token.IsCancellationRequested)
                {
                    //if there is more events to dispatch we sleep for a bit and then we go again
                    await Task.Delay(1000, CancellationToken.None).ConfigureAwait(false);
                }
            } while (!token.IsCancellationRequested && more);
        }
コード例 #2
0
        void TryProcessMessage(object obj)
        {
            var cancellationToken = (CancellationToken)obj;

            while (!cancellationToken.IsCancellationRequested)
            {
                BrokeredMessage brokeredMessage = null;

                if (pendingMessages.Count > 0)
                {
                    brokeredMessage = pendingMessages.Dequeue() as BrokeredMessage;
                }

                if (brokeredMessage == null)
                {
                    if (timeToDelayNextPeek < MaximumWaitTimeWhenIdle)
                    {
                        timeToDelayNextPeek += PeekInterval;
                    }

                    Thread.Sleep(timeToDelayNextPeek);
                    continue;
                }

                timeToDelayNextPeek = 0;
                Exception exception = null;

                // due to clock drift we may receive messages that aren't due yet according to our clock, let's put this back
                if (brokeredMessage.ScheduledEnqueueTimeUtc > DateTime.UtcNow)
                {
                    pendingMessages.Enqueue(brokeredMessage);
                    continue;
                }


                if (!RenewLockIfNeeded(brokeredMessage))
                {
                    continue;
                }

                var transportMessage = brokeredMessage.ToTransportMessage();

                try
                {
                    if (settings.IsTransactional)
                    {
                        using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
                        {
                            Transaction.Current.EnlistVolatile(new ReceiveResourceManager(brokeredMessage), EnlistmentOptions.None);

                            if (transportMessage != null)
                            {
                                if (tryProcessMessage(transportMessage))
                                {
                                    scope.Complete();
                                }
                            }
                        }
                    }
                    else
                    {
                        if (transportMessage != null)
                        {
                            tryProcessMessage(transportMessage);
                        }
                    }

                    circuitBreaker.Success();
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    if (!cancellationToken.IsCancellationRequested && (transportMessage != null || exception != null))
                    {
                        endProcessMessage(transportMessage, exception);
                    }
                }
            }
        }