Azure Functions:Servicebustrigger -> BrokeredMessage 已被处置
Azure Functions: Servicebustrigger -> BrokeredMessage been disposed
我一直在写很多具有相似功能的 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 has been disposed.
如果我没有在最后调用 message.CompleteAsync(),消息仍会标记为已完成。我可以接受,但我也希望能够放弃消息,而且该功能也不总是有效。
有人做过类似的事情,有解决办法吗?使用 .NET Standard 2.0 和以下适用于 ServiceBus 的 NuGet 包:Microsoft.Azure.ServiceBus v2.0.0
您不应手动完成或放弃邮件。 Azure Functions 运行时将根据函数执行的成功或失败(异常)为你完成。
因此,如果您想放弃,请抛出异常。它将再次 auto-retried 直到最大递送计数限制。
我一直在写很多具有相似功能的 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 has been disposed.
如果我没有在最后调用 message.CompleteAsync(),消息仍会标记为已完成。我可以接受,但我也希望能够放弃消息,而且该功能也不总是有效。
有人做过类似的事情,有解决办法吗?使用 .NET Standard 2.0 和以下适用于 ServiceBus 的 NuGet 包:Microsoft.Azure.ServiceBus v2.0.0
您不应手动完成或放弃邮件。 Azure Functions 运行时将根据函数执行的成功或失败(异常)为你完成。
因此,如果您想放弃,请抛出异常。它将再次 auto-retried 直到最大递送计数限制。