示例#1
0
        private void HandleMessage(IMessageQueue messageQueue, Message message)
        {
            var rejectPolicy = _queueConfig.QueueRejectPolicy;

            // Если не отказываемся обрабатывать сообщение
            if (rejectPolicy == null || rejectPolicy.MustReject() == false)
            {
                var acknowledgePolicy = _queueConfig.QueueAcknowledgePolicy;

                if (acknowledgePolicy != null)
                {
                    var acknowledge = false;

                    // Подтверждение окончания обработки сообщения, если разрешено
                    if (acknowledgePolicy.OnBefore())
                    {
                        messageQueue.Acknowledge(message);
                        acknowledge = true;
                    }

                    var consumer = _consumerFactory();

                    try
                    {
                        consumer.Handle(message);

                        // Подтверждение окончания обработки сообщения, если разрешено
                        if (!acknowledge && acknowledgePolicy.OnSuccess())
                        {
                            messageQueue.Acknowledge(message);
                        }
                    }
                    catch (Exception exception)
                    {
                        OnConsumerError(exception);

                        // Подтверждение окончания обработки сообщения, если разрешено
                        if (!acknowledge && acknowledgePolicy.OnFailure(exception))
                        {
                            messageQueue.Acknowledge(message);
                        }
                    }
                }
                else
                {
                    var consumer = _consumerFactory();

                    try
                    {
                        consumer.Handle(message);
                    }
                    catch (Exception exception)
                    {
                        OnConsumerError(exception);
                    }
                }
            }
            else
            {
                messageQueue.Reject(message);
            }
        }