我的服务总线队列中有一个运行很长时间的过程。我希望它持续5分钟以上

时间:2019-03-01 11:13:12

标签: c# azure parallel-processing azureservicebus

我有一个运行时间很长的过程,它使用服务总线在数百万条记录之间进行匹配,但是我的过程经过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;
   }
}

1 个答案:

答案 0 :(得分:1)

消息旨在用于通知,而不是长时间运行的处理。

您有几个选择:

  1. 接收消息并依靠接收者的RenewLock()操作来扩展锁。
  2. 使用用户回调API并通过MessageHandlerOptions.MaxAutoRenewDuration设置来指定最长处理时间(如果已知),以自动更新邮件的锁定。
  3. 记录已开始的处理,但不完成传入消息。而是利用message deferral功能,向您发送一条新的延迟消息,并参考延迟的消息SequenceNumber。这将使您定期收到“提醒”消息,以查看工作是否完成。如果是,请通过其SequenceNumber来完成延迟的消息。否则,请完成“提醒”消息并发送新消息。这种方法将需要对架构进行一定程度的重新设计。
  4. 类似于选项3,但是将处理卸载到外部进程,该进程稍后将报告状态。有一些框架可以帮助您。 MassTransit或NServiceBus。后者具有sample,您可以下载并使用它。

请注意,不保证选项1和2 ,因为它们是客户端发起的操作。