我有一个运行时间很长的过程,它使用服务总线在数百万条记录之间进行匹配,但是我的过程经过5分钟的限制后,Azure再次从头开始处理已经处理过的记录。
如何避免这种情况
这是我的代码:
private static async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
long receivedMessageTrasactionId = 0;
try
{
IQueueClient queueClient = new QueueClient(serviceBusConnectionString, serviceBusQueueName, ReceiveMode.PeekLock);
// Process the message
receivedMessageTrasactionId = Convert.ToInt64(Encoding.UTF8.GetString(message.Body));
// My Very Long Running Method
await DataCleanse.PerformDataCleanse(receivedMessageTrasactionId);
//Get Transaction and Metric details
await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
catch (Exception ex)
{
Log4NetErrorLogger(ex);
throw ex;
}
}
答案 0 :(得分:1)
消息旨在用于通知,而不是长时间运行的处理。
您有几个选择:
RenewLock()
操作来扩展锁。MessageHandlerOptions.MaxAutoRenewDuration
设置来指定最长处理时间(如果已知),以自动更新邮件的锁定。SequenceNumber
。这将使您定期收到“提醒”消息,以查看工作是否完成。如果是,请通过其SequenceNumber
来完成延迟的消息。否则,请完成“提醒”消息并发送新消息。这种方法将需要对架构进行一定程度的重新设计。请注意,不保证选项1和2 ,因为它们是客户端发起的操作。