Skip to content

Instantly share code, notes, and snippets.

@KevM
Created August 27, 2009 17:12
Show Gist options
  • Save KevM/176427 to your computer and use it in GitHub Desktop.
Save KevM/176427 to your computer and use it in GitHub Desktop.
public abstract class RetryingConsumerOfAll<TMessage> : Consumes<TMessage>.All where TMessage : class
{
protected RetryingConsumerOfAll(Scheduler scheduler)
{
Scheduler = scheduler;
}
private int _maximumNumberOfRetries = 5;
public int MaximumNumberOfRetries
{
get { return _maximumNumberOfRetries; }
set { _maximumNumberOfRetries = value; }
}
public Scheduler Scheduler { get; set; }
public void Consume(TMessage message)
{
try
{
ConsumeMessage(message);
}
catch
{
if (CurrentMessage.Headers.RetryCount >= MaximumNumberOfRetries)
{
CurrentMessage.GenerateFault(message);
return;
}
var bus = InboundMessageHeaders.Current.Bus;
var retryCount = CurrentMessage.Headers.RetryCount+ 1;
Scheduler.Schedule(1000, () => bus.Publish(message, c => c.SetRetryCount(retryCount)));
//CurrentMessage.RetryLater();
}
}
protected abstract void ConsumeMessage(TMessage message);
}
public class SimpleMessageConsumer : RetryingConsumerOfAll<SimpleMessage>
{
private readonly ILogger _logger;
public SimpleMessageConsumer(ILogger logger, Scheduler scheduler) : base(scheduler)
{
_logger = logger;
}
protected override void ConsumeMessage(SimpleMessage message)
{
var retryCount = CurrentMessage.Headers.RetryCount;
if(retryCount < 5)
{
_logger.LogError("Throwing message {0}, {1} times.", message.Body, retryCount);
throw new Exception("Throwing message.");
}
_logger.LogInfo("Received message '{0}' after {1} retries", message.Body, retryCount);
}
public void Dispose()
{
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment