2017-09-16 152 views
0

我正在使用带自动完成选项的QueueClient消息泵。当从回调中抛出异常时,消息将被重试并最终失效。Azure服务总线消息重试TaskCancelationException

不幸的是,当从回调中抛出TaskCancelationException或OperationCanceledException时,情况并非如此。该消息会自动完成并且不会重试。另外OptionsOnExceptionReceived事件处理程序不被调用。

_queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName, ReceiveMode.PeekLock); 

...

public void OnMessageAsync(Func<BrokeredMessage, Task> callback) 
    { 
     if (_queueClient.IsClosed == false) 
     { 
      var options = new OnMessageOptions 
      { 
       MaxConcurrentCalls = _maxConcurrentCalls, 
       AutoRenewTimeout = TimeSpan.FromMinutes(_autoRenewTimeoutInMinutes), 
       AutoComplete = true 
      }; 

      options.ExceptionReceived += OptionsOnExceptionReceived; 

      _queueClient.OnMessageAsync(callback, options); 
     } 
    } 

上午我在这里做得不对,它是一个错误或可能预期的行为?

+0

Azure Service Bus在另一个线程上正在进行完成。您是否尝试禁用自动完成并在回调中完成自己? –

+0

我确定手动自动完成功能可以正常工作。我很好奇为什么它不应该完成消息 – 85rainbow

+0

如果在另一个线程上完成,与任务相关的异常将不会到达该代码。 –

回答

0

我假设。不知道实际的代码在做什么(这个客户端不是开源的,在新客户端看起来这种情况不应该发生)。 ASB客户端正在执行的回调周围存在异常处理,但无法处理任务异常,从而允许完成该消息。您可以向客户here向ASB团队提出问题。