Skip to content

Instantly share code, notes, and snippets.

@lfgrando
Last active July 20, 2018 18:15
Show Gist options
  • Save lfgrando/2b952eefb95364c8f6b4ce3505965fc2 to your computer and use it in GitHub Desktop.
Save lfgrando/2b952eefb95364c8f6b4ce3505965fc2 to your computer and use it in GitHub Desktop.
How to defer a ServiceBus message using custom properties.
public bool DoWork(BrokeredMessage message)
{
if (message == null)
throw new ArgumentNullException(nameof(message));
try
{
if (!_isInitialized)
Initialize();
var movementRollbackMessage = message.GetBody<MovementRollbackMessage>();
((RequestData)Container.Context.Properties.RequestData).AddTenant(movementRollbackMessage.TenantId);
using (var communicationMovements = Container.Context.DependencyInjection.Resolve<ICommunicationMovementBusiness>())
communicationMovements.Rollback(movementRollbackMessage.MovementId, movementRollbackMessage.Username);
//
return true;
}
catch (DeferredException)
{
// Check for resubmits, complete message and send a clone with a deferred wait of 6,1 minutes
var resubmitCount = message.Properties.ContainsKey("ResubmitCount") ? (int)message.Properties["ResubmitCount"] : 0;
var deliveryCount = message.DeliveryCount > 0 ? 1 : 0;
if (resubmitCount >= 10)
{
Log.Write($"Muitos retries: {resubmitCount}. Enviando para deadletter", String.Empty);
message.DeadLetter("Too many retries", $"ResubmitCount is {resubmitCount}");
return false;
}
else
{
using (var topic = new ServiceBusTopicRepository(Constants.ServiceBus.ServiceBusConnectionName, Constants.ServiceBus.CommunicationMovementRollback))
topic.CloneAndSend(message, new Dictionary<string, object> { { "ResubmitCount", resubmitCount + deliveryCount } }, DateTime.UtcNow.AddSeconds(370));
Log.Write($"Mensagem clonada. DeliveryCount: {deliveryCount} ResubmitCount: {resubmitCount} ClonedWith: {resubmitCount + deliveryCount}", string.Empty);
// Complete the message
return true;
}
}
catch (Exception ex)
{
Log.Write($"Erro comum no rollback:{ex.Message}", $"Sub error:<br>{ex.InnerException?.Message}.<br>StackTrace:<br>{ex.StackTrace}.");
throw;
}
finally
{
((RequestData)Container.Context.Properties.RequestData).RemoveTenant();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment