示例#1
0
        private async Task <bool> TryInvokeMessageHandlerAsync(IQueueMessage message)
        {
            try
            {
                if (_messageHandler != null)
                {
                    await _messageHandler(message, CancellationToken.None);

                    return(true);
                }
            }
            catch (Exception ex)
            {
                var exceptionReceivedHandler = _messageHandlerOptions?.ExceptionReceivedHandler;

                if (exceptionReceivedHandler != null)
                {
                    var context = new MessageHandlerExceptionContext(ex);

                    await exceptionReceivedHandler(context);
                }
            }

            return(false);
        }
        private static Func <ExceptionReceivedEventArgs, Task> GetExceptionReceivedHandler(
            MessageHandlerOptions options)
        {
            if (options?.ExceptionReceivedHandler == null)
            {
                return(_ => Task.CompletedTask);
            }

            Task ExceptionReceivedHandler(ExceptionReceivedEventArgs args)
            {
                var context = new MessageHandlerExceptionContext(args.Exception);

                return(options.ExceptionReceivedHandler(new MessageHandlerExceptionContext(args.Exception)));
            }

            return(ExceptionReceivedHandler);
        }
示例#3
0
        private async Task OnMessageReceivedAsync(
            Func <IMessage, CancellationToken, Task> messageHandler,
            MessageHandlerOptions messageHandlerOptions,
            BasicDeliverEventArgs eventArgs)
        {
            var cancellationToken = CancellationToken.None;

            var message = new RabbitMQMessage(
                eventArgs.Body,
                eventArgs.DeliveryTag,
                eventArgs.BasicProperties);

            try
            {
                await messageHandler(message, cancellationToken);

                if (messageHandlerOptions.AutoComplete)
                {
                    await CompleteAsync(message, cancellationToken);
                }
            }
            catch (Exception ex)
            {
                try
                {
                    var exceptionHandler = messageHandlerOptions?.ExceptionReceivedHandler;

                    if (exceptionHandler != null)
                    {
                        var context = new MessageHandlerExceptionContext(ex);

                        await exceptionHandler(context);
                    }
                }
                catch
                {
                }

                await AbandonAsync(message, cancellationToken);
            }
        }
        private async Task MessagePumpTaskAsync()
        {
            while (!_cancellationToken.IsCancellationRequested)
            {
                IQueueMessage message = null;

                var pollingRetryCount = 0;

                try
                {
                    await _semaphore.WaitAsync(_cancellationToken).ConfigureAwait(false);

                    message = await _queueClient.MessageReceiver(_cancellationToken).ConfigureAwait(false);

                    if (message != null)
                    {
                        pollingRetryCount = 0;

                        Task.Run(async() =>
                        {
                            try
                            {
                                await _onMessageCallback(message, _cancellationToken).ConfigureAwait(false);

                                if (_messageHandlerOptions.AutoComplete)
                                {
                                    await _queueClient.CompleteAsync(message, _cancellationToken).ConfigureAwait(false);
                                }
                            }
                            catch (Exception ex)
                            {
                                try
                                {
                                    var exceptionHandler = _messageHandlerOptions?.ExceptionReceivedHandler;

                                    if (exceptionHandler != null)
                                    {
                                        var context = new MessageHandlerExceptionContext(ex);

                                        await exceptionHandler(context).ConfigureAwait(false);
                                    }
                                }
                                catch
                                {
                                }

                                await _queueClient.AbandonAsync(message, _cancellationToken).ConfigureAwait(false);

                                throw;
                            }
                        })
                        .Ignore();
                    }
                    else
                    {
                        // Back off from polling when there are no messages in the queue.
                        var interval = _retryStrategy.GetRetryInterval(++pollingRetryCount);

                        await Task.Delay(interval);
                    }
                }
                finally
                {
                    if (message == null)
                    {
                        _semaphore.Release();
                    }
                }
            }
        }