/// <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> /// Read messages containg the given type T off the defined /// error queue and moves them to the user defined read queue /// </summary> public void ReturnErrorMessages() { if ((_errorQueue == null || !_errorQueue.IsInitialized) || (_readQueue == null || !_readQueue.IsInitialized)) { throw new BusException("Bus has not been configured for returning messages to the read queue. Did you forget to call DefineReadQueue and/or DeineErrorQueue on BusBuilder?"); } foreach (Message message in _errorQueue.GetAllMessages()) { var context = new ReadMessageContext(_errorQueue, _readQueue); var returnToSourceHandler = new ReturnToSourceHandler(context, _logger); var loggingAspect = new LoggingAspect(returnToSourceHandler, ReturnOperation, _logger); loggingAspect.Handle(message); } }
/// <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); } }
/// <summary> /// Read specific message off the defined error queue and move it to the user defined read queue /// </summary> public void ReturnErrorMessage(string id) { if ((_errorQueue == null || !_errorQueue.IsInitialized) || (_readQueue == null || !_readQueue.IsInitialized)) { throw new BusException("Bus has not been configured for returning messages to the read queue. Did you forget to call DefineReadQueue and/or DeineErrorQueue on BusBuilder?"); } try { Message message = _errorQueue.GetMessageBy(id); var context = new ReadMessageContext(_errorQueue, _readQueue); var returnToSourceHandler = new ReturnToSourceHandler(context, _logger); var loggingAspect = new LoggingAspect(returnToSourceHandler, ReturnOperation, _logger); loggingAspect.Handle(message); } catch (Exception) { throw new BusException(String.Format("Message with id {0} was not found on the error queue", id)); } }
/// <summary> /// Read messages containing the given type T off the defined /// error queue and moves them to the user defined read queue /// </summary> public void ReturnAllErrorMessages() { if ((_errorQueue == null || !_errorQueue.IsInitialized) || (_readQueue == null || !_readQueue.IsInitialized)) { throw new BusException("Bus has not been configured for returning messages to the read queue. Did you forget to call DefineReadQueue and/or DeineErrorQueue on BusBuilder?"); } try { foreach (Message message in _errorQueue.GetAllMessages()) { var context = new ReadMessageContext(_errorQueue, _readQueue); var returnToSourceHandler = new ReturnToSourceHandler(context, _logger); var loggingAspect = new LoggingAspect(returnToSourceHandler, ReturnOperation, _logger); loggingAspect.Handle(message); } } catch (Exception ex) { throw new BusException(String.Format("A problem occurred retreiving messages from the error queue: {0}", ex)); } }