public MessageProcessor() { _mainQueue = _mainQueue = new MainExampleQueue( new MessageQueueFactory(), new NonFunctionalCircuitBreaker(), new ConsoleLogger()); _poisonQueue = new PoisonExampleQueue( new MessageQueueFactory(), new NonFunctionalCircuitBreaker(), new ConsoleLogger()); }
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); } }