我无法重试 Azure 服务总线主题中的失败项
I can't retry failed item in Azure Service Bus topic
我有一个进程正在使用 Azure 服务总线主题中的项目。
如果一切顺利就没有问题,但如果过程出现错误,我需要重试消费失败的项目。
这是我的消息处理程序;
public async Task StartRecieverAsync()
{
var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
MaxConcurrentCalls = 1,
AutoComplete = false,
MaxAutoRenewDuration = TimeSpan.FromSeconds(30)
};
_creatorSubscription.RegisterMessageHandler(ProcessCreatorMessageAsync, messageHandlerOptions);
Console.ReadLine();
await _creatorSubscription.CloseAsync();
}
private async Task ProcessCreatorMessageAsync(Message message, CancellationToken token)
{
try
{
var jsonString = Encoding.UTF8.GetString(message.Body);
PickingRequest req = JsonSerializer.Deserialize<PickingRequest>(jsonString);
WorkOrderManager manager = new WorkOrderManager(_sqlManager, _cacheManager, _workOrderFunctions);
manager.CreatePickingTask(req);
SendNotification(req.UserRegistrationNumber, NotificationConstants.PickingRequestNotification);
await _creatorSubscription.CompleteAsync(message.SystemProperties.LockToken);
}
catch
{
if (message.SystemProperties.DeliveryCount < 5)
{
await _creatorSubscription.AbandonAsync(message.SystemProperties.LockToken);
}
else
{
await _creatorSubscription.DeadLetterAsync(message.SystemProperties.LockToken);
}
}
}
前5次,我想再试一次,但结果没有改变,我想将项目发送到死信队列。但是在第一次之后,该项目进入了死信队列。
服务总线上的主题订阅是如何配置的?如果最大传递计数为 1,则服务总线在第一次失败后会将消息移至死信队列。
服务总线主题订阅属性:
- 此外,通常不需要通过调用
DeadLetterAsync
手动为消息添加死信,服务总线会在超过最大传递计数后执行此操作。也就是说,您的 catch 块可以简化为 await _creatorSubscription.AbandonAsync(message.SystemProperties.LockToken);
我有一个进程正在使用 Azure 服务总线主题中的项目。 如果一切顺利就没有问题,但如果过程出现错误,我需要重试消费失败的项目。
这是我的消息处理程序;
public async Task StartRecieverAsync()
{
var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
{
MaxConcurrentCalls = 1,
AutoComplete = false,
MaxAutoRenewDuration = TimeSpan.FromSeconds(30)
};
_creatorSubscription.RegisterMessageHandler(ProcessCreatorMessageAsync, messageHandlerOptions);
Console.ReadLine();
await _creatorSubscription.CloseAsync();
}
private async Task ProcessCreatorMessageAsync(Message message, CancellationToken token)
{
try
{
var jsonString = Encoding.UTF8.GetString(message.Body);
PickingRequest req = JsonSerializer.Deserialize<PickingRequest>(jsonString);
WorkOrderManager manager = new WorkOrderManager(_sqlManager, _cacheManager, _workOrderFunctions);
manager.CreatePickingTask(req);
SendNotification(req.UserRegistrationNumber, NotificationConstants.PickingRequestNotification);
await _creatorSubscription.CompleteAsync(message.SystemProperties.LockToken);
}
catch
{
if (message.SystemProperties.DeliveryCount < 5)
{
await _creatorSubscription.AbandonAsync(message.SystemProperties.LockToken);
}
else
{
await _creatorSubscription.DeadLetterAsync(message.SystemProperties.LockToken);
}
}
}
前5次,我想再试一次,但结果没有改变,我想将项目发送到死信队列。但是在第一次之后,该项目进入了死信队列。
服务总线上的主题订阅是如何配置的?如果最大传递计数为 1,则服务总线在第一次失败后会将消息移至死信队列。 服务总线主题订阅属性:
- 此外,通常不需要通过调用
DeadLetterAsync
手动为消息添加死信,服务总线会在超过最大传递计数后执行此操作。也就是说,您的 catch 块可以简化为await _creatorSubscription.AbandonAsync(message.SystemProperties.LockToken);