Azure功能:Servicebustrigger - > BrokeredMessage已被处置

时间:2018-03-14 12:24:18

标签: azure azure-functions servicebus objectdisposedexception

我一直在编写很多具有类似功能的Webjobs,其中类似的代码工作得很好。但是使用Azure Functions而我有时会收到错误。

[FunctionName("Alert")]
public static async void Alert([ServiceBusTrigger(Topic.Alert, Subscription.Sql, AccessRights.Listen, Connection = "servicebusconnectionstring")] BrokeredMessage message, TraceWriter log)
{
    using (var stream = message.GetBody<Stream>())
    {
        using (var memoryStream = new MemoryStream())
        {
            stream.CopyTo(memoryStream);
            var json = Encoding.UTF8.GetString(memoryStream.ToArray());

            try
            {
                throw new Exception("Test-Exception");
            }
            catch (Exception e)
            {
                EventLogger.LoggException("Function.Sql.Alert", e, new Dictionary<string, string>() { { "Messsage", json } });
                if (message.DeliveryCount >= 5)
                {
                    EventLogger.LoggEvent("DeadLetterQueue", new Dictionary<string, string>() { { "Function", "Function.Sql.Alert" }, { "Messsage", json } });
                    await QueueService.SendAsync(Queue.Deadletter, JsonConvert.DeserializeObject<CloudAlert>(json));
                    await message.CompleteAsync();
                }
                else
                    await message.AbandonAsync();
            }
        }
    }
    await message.CompleteAsync();
}

问题是当我调用message.AbandonAsync()或者message.CompleteAsync时,它有时会抛出

  

System.ObjectDisposedException:已经处理了BrokeredMessage。

如果我不在最后调用message.CompleteAsync(),则邮件仍然标记为已完成。我可以忍受这一点,但我希望能够放弃这个消息,而且功能也总是有效。

有人做过类似的事情并有解决方案吗?使用.NET Standard 2.0并遵循ServiceBus的NuGet包:Microsoft.Azure.ServiceBus v2.0.0

1 个答案:

答案 0 :(得分:0)

您不应手动填写或放弃邮件。 Azure Functions运行时将根据函数执行失败(异常)的成功为您执行此操作。

所以,如果你想要放弃,抛出异常。它将再次自动重试,直到最大交货计数限制。