Beispiel #1
0
        public MessageProcessor()
        {
            _mainQueue = _mainQueue = new MainExampleQueue(
                new MessageQueueFactory(),
                new NonFunctionalCircuitBreaker(),
                new ConsoleLogger());

            _poisonQueue = new PoisonExampleQueue(
                new MessageQueueFactory(),
                new NonFunctionalCircuitBreaker(),
                new ConsoleLogger());
        }
Beispiel #2
0
        public void Process <T>(
            Action <T> processMessage,
            IPoisonQueue poisonQueue) where T : class
        {
            if (processMessage == null)
            {
                throw new ArgumentNullException(nameof(processMessage));
            }

            if (poisonQueue == null)
            {
                throw new ArgumentNullException(nameof(poisonQueue));
            }

            if (_messageQueue == null)
            {
                Initialize();
            }

            try
            {
                //Sanity Count
                var processingMessageCount = 1000;
                var messageEnumerator      = _messageQueue.GetMessageEnumerator2();

                while (messageEnumerator.MoveNext(TimeSpan.FromSeconds(1)) &&
                       processingMessageCount > 0)
                {
                    processingMessageCount--;

                    if (messageEnumerator.Current == null)
                    {
                        continue;
                    }

                    using (var mainTransaction = new MessageQueueTransaction())
                        using (var posionTransaction = new MessageQueueTransaction())
                        {
                            try
                            {
                                mainTransaction.Begin();
                                posionTransaction.Begin();

                                Message message = null;

                                try
                                {
                                    message = _messageQueue.ReceiveById(messageEnumerator.Current.Id, mainTransaction);
                                }
                                catch
                                {
                                    // ignored
                                }

                                //message is probably moved to another queue
                                if (message == null)
                                {
                                    mainTransaction.Abort();
                                    posionTransaction.Abort();
                                    continue;
                                }

                                poisonQueue.Send(message, posionTransaction);

                                var obj = (T)message.Body;
                                _circuitBreaker.Execute(() => processMessage(obj));

                                mainTransaction.Commit();
                                posionTransaction.Abort();
                            }
                            catch (DeliveryFailureException ex)
                            {
                                mainTransaction.Abort();
                                posionTransaction.Abort();
                                _logger.Error("Delivery error", ex);
                            }
                            catch (BrokenCircuitException ex)
                            {
                                mainTransaction.Abort();
                                posionTransaction.Abort();
                                _logger.Error("Broken circuit", ex);
                                break;
                            }
                            catch (Exception ex)
                            {
                                posionTransaction.Commit();
                                mainTransaction.Commit();
                                _logger.Error("Processing error", ex);
                            }
                        }
                }
            }
            catch (Exception ex)
            {
                throw new QueueException("Error handling message from queue", ex);
            }
        }