2016-11-16 134 views
0

我试图让一个队列的重试逻辑工作,我遇到了问题。 minBackoff变量似乎并不实际工作。我在我的日志中看到,接收到的消息失败,然后几乎立即重试。我的minBackoff设置为600秒。Azure服务总线重试策略的minbackoff不起作用?

下面是设置了查询代码:

NamespaceManager nsManager = NamespaceManager.CreateFromConnectionString(connectionString); 
     nsManager.Settings.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(5), 
                  maxBackoff: TimeSpan.FromSeconds(30), 
                  maxRetryCount: 3); 

     if (!nsManager.QueueExists(queueName)) 
     { 
      nsManager.CreateQueue(queueName); 
     } 
     else 
     { 
      nsManager.DeleteQueue(queueName); 
      nsManager.CreateQueue(queueName); 
     } 

     QueueClient client = QueueClient.CreateFromConnectionString(connectionString, queueName); 


     client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15), 
                 maxBackoff: TimeSpan.FromSeconds(600), 
                 maxRetryCount: 3); 
     for (int i = 0; i < 2000; i++) 
     { 
      UserCreationSubmitted creationMessage = new UserCreationSubmitted() 
      { 
       CreationStatus = "Step 1", 
       Id = Guid.NewGuid(), 
       UserName = "user number " + i, 
       Userid = Guid.NewGuid() 
      }; 

      BrokeredMessage message = new BrokeredMessage(creationMessage); 
      client.Send(message); 

     } 

下面是不工作如何,我认为它应该代码...

client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15), 
                 maxBackoff: TimeSpan.FromSeconds(600), 
                 maxRetryCount: 3); 

     client.OnMessage(message => 
     { 

      UserCreationSubmitted msg = message.GetBody<UserCreationSubmitted>(); 
      Console.WriteLine("------------------------------"); 
      Console.WriteLine($"Body {msg.UserName}"); 

      Random rnd = new Random(); 
      int ranNum = rnd.Next(0, 9); 
      if (msg.UserName.Contains(ranNum.ToString())) 
      { 
       Console.WriteLine("!!!Error!!!"); 
       Console.WriteLine("------------------------------"); 
       throw new Exception(); 
      } 
     }); 

有没有人有一个想法,为什么minbackoff和maxbackoff在这里似乎并不实际工作?奇怪的是,maxRetryCount像一个骑兵一样工作,所以我想这绝对是我的实现中的一些东西,导致其他人无法工作。

回答

1

RetryExponential由ASB客户端用于重试,当收到故障时消息正在发生。在你的代码中,在收到消息的事实之后,在OnMessage API回调中处理期间引发异常。 OnMessage API将abandon the message,导致它立即显示。

有几个选项,你可以采取:

  1. 克隆的消息,设置ScheduledEnqueueTimeUtc到你想要的延迟,发送,然后完成原始邮件。
  2. 推迟发送消息,但您只能通过SequenceNumber接收。在这种情况下,您可以创建一个包含原始消息序列号作为有效负载的新消息,安排新消息并发送它。这样你就可以在原始信息上得到准确的计数。

理想情况下,放弃带有时间跨度的消息会很好,但对于当前的API来说这是不可能的。

+0

非常感谢,这是非常有帮助 – Debacle

+0

@Debacle欢迎您 –