/// <summary> /// Reads messages off a queue as they arrive, deserializes them into the /// specified type T and invokes registered handlers. This operation is /// asynchnronous meaning registered handlers will be invoked on the /// background thread. /// </summary> /// <typeparam name="T"></typeparam> public void ReceiveAsync <T>() { if (_readQueue == null || !_readQueue.IsInitialized) { throw new BusException("Bus has not been configured for receiving messages. Did you forget to call DefineReadQueue on BusBuilder?"); } _readQueue.ReceiveAsync(message => { var context = new ReadMessageContext(_errorQueue, _readQueue); var receiveMessageHandler = new ReceiveMessageHandler <T>(_handlers, _config, _logger); var retryAspect = new RetryAspect(receiveMessageHandler, _config, _logger); var removeFromReadQueueAspect = new RemoveFromReadQueueAspect(retryAspect, context, _config, _logger); var moveToErrorQueueAspect = new MoveToErrorQueueAspect(removeFromReadQueueAspect, context, _config, _logger); var loggingAspect = new LoggingAspect(moveToErrorQueueAspect, ReceiveOperation, _logger); var transactionAspect = new TransactionAspect(loggingAspect, _logger); var discardAspect = new DiscardFailuresAspect(transactionAspect, _config, _logger); var failFastAspect = new FailFastAspect(discardAspect, _config, _logger); failFastAspect.Handle(message); if (failFastAspect.Failed) { _readQueue.StopReceiveAsync(); } }); }
/// <summary> /// Reads messages off a queue, deserializes them into the /// specified type T and invokes registered handlers. Useful when /// you want to control when messages are processed i.e. at a set /// time every day, for example. /// </summary> public void Receive <T>() { if (_readQueue == null || !_readQueue.IsInitialized) { throw new BusException("Bus has not been configured for receiving messages. Did you forget to call DefineReadQueue on BusBuilder?"); } foreach (Message message in _readQueue.GetAllMessages()) { var context = new ReadMessageContext(_errorQueue, _readQueue); var receiveMessageHandler = new ReceiveMessageHandler <T>(_handlers, _config, _logger); var retryAspect = new RetryAspect(receiveMessageHandler, _config, _logger); var removeFromReadQueueAspect = new RemoveFromReadQueueAspect(retryAspect, context, _logger); var moveToErrorQueueAspect = new MoveToErrorQueueAspect(removeFromReadQueueAspect, context, _logger); var loggingAspect = new LoggingAspect(moveToErrorQueueAspect, ReceiveOperation, _logger); var transactionAspect = new TransactionAspect(loggingAspect, _logger); transactionAspect.Handle(message); } }