我有从Azure服务队列中读取贷款号码点网络代码,并为每个贷款号码调用我的API。
这是我调用api的代码。
private async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
try
{
string loanNumber = Encoding.UTF8.GetString(message.Body);
_logger.LogInformation($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} LoanNumber:{loanNumber}");
//API CALL HERE
await _apiClient.getResult(loanNumber);
await _queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
catch (Exception ex)
{
//sending failed messages to Dead Letter queue
await _queueClient.AbandonAsync(message.SystemProperties.LockToken);
}
}
失败的贷款号码被成功发送到死信队列。当服务器关闭或来自API响应的错误请求时。
我想在一段时间后对死信队列中的贷款号码调用api。有没有办法在一段时间后将死信队列中的消息转换为活动消息?
我是第一次使用Azure,请帮我解决这个问题。
先谢谢你。
4条答案
按热度按时间up9lanfz1#
有没有办法在一定的时间间隔后将死信队列中的消息转换为活动消息?
自动地,不。但是你可以做的是从死信队列中读取消息,然后将它们作为新消息发布到你的主队列中。
至于自动化整个过程,一个可能的解决方案是运行一个定时器触发的Azure函数,该函数定期从死信队列中读取消息,并将它们发布到您的主队列中。
5lhxktic2#
@akhil,值得注意的是,这些消息会自动在主队列中重新排队,直到它们的
DeliveryCount
超过您的主队列的MaxDeliveryCount
。MaxDeliveryCount
的默认值是10,因此任何失败的API请求都会被这个处理程序重试10次,然后才被移动到DLQ。如果你想对此更“聪明”一点,你可以使用
catch
块中消息的ScheduledEnqueueTimeUtc
属性来延迟重试。正如@ GauravMantri所说,该框架没有提供任何“免费”处理死信消息的功能;您必须像处理普通队列一样自己编写处理程序。
wbgh16ku3#
否,无法将DLQ消息转换为活动消息。
您需要处理DLQ并修复它在DLQ中结束的原因,然后将其重新传输回您的队列。
Github的一个示例在这里可能会很有用。
https://github.com/Azure/azure-service-bus/tree/master/samples/DotNet/Microsoft.ServiceBus.Messaging/DeadletterQueue
(This示例显示如何将消息移动到死信队列,如何从中检索消息,以及如何将更正后的消息重新提交回主队列。)
n3schb8v4#
这可能是一个旧的答案,但我们可以使用微软的ServiceBusExplorer。
如果您还有其他问题,请告诉我。