C# 服务总线消息处理不正确得到异常仍然没有进入死信?
我有一个azure函数,当新消息进入服务总线主题时触发C# 服务总线消息处理不正确得到异常仍然没有进入死信?,c#,azure,azure-functions,azureservicebus,C#,Azure,Azure Functions,Azureservicebus,我有一个azure函数,当新消息进入服务总线主题时触发 [FunctionName("processData")] public static void Run([ServiceBusTrigger("customer", "customer", AccessRights.Manage, Connection = "ServiceBusConnectionString")]string mySbMsg, TraceWriter log) {
[FunctionName("processData")]
public static void Run([ServiceBusTrigger("customer", "customer", AccessRights.Manage, Connection = "ServiceBusConnectionString")]string mySbMsg, TraceWriter log)
{
try
{
// get the first bearer token
var access_token = GetBearerToken();
// call API
var APIresponse = APICall("APIURL", access_token, log);
// if api response status code is OK 200 then process the message
if (APIresponse.StatusCode == System.Net.HttpStatusCode.OK)
{
// for testing
}
else
{
// how to abandon message here
}
//log.Info($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
}
catch (Exception ex)
{
log.Info($"Exception: {ex}");
}
}
但不管怎样,在执行上述代码后,订阅中的消息计数将变为0
如何控制消息处理?当任何异常发生时,我们如何使用放弃使消息变成死信
我试图在代码之间添加新的抛出异常“test”,但它进入catch,仍然没有消息以死信形式转发。如果我没有弄错的话,您的函数需要抛出异常才能将其视为失败。当前您正在处理使函数成功运行的异常 您可以尝试将挡块更改为:
catch (Exception ex)
{
log.Info($"Exception: {ex}");
throw;
}
当任何异常发生时,我们如何使用放弃使消息变成死信
每次您放弃邮件时,传递计数将增加1。当它达到最大传递计数时,它将被发送到死信队列
放弃只影响被放弃的位置,死信队列是分开的
一个警告是,如果您想重新提交死信队列中的消息,您不能直接将它们发送到相应的订阅,它必须再次浏览该主题
编辑:
在应用程序中,每当处理过程中发生异常时,您都希望再次重新处理该消息。为此,我们提供了放弃异步的功能
放弃异步使用锁令牌放弃消息,这将使消息再次可用于处理
为了验证这一点,我们需要从ReceiveMessageAsync和catch块调用放弃异步方法显式抛出异常
static async Task ReceiveMessagesAsync(Message message, CancellationToken token)
{
try
{
Console.WriteLine($"Received message: {Encoding.UTF8.GetString(message.Body)}");
int i = 0;
i=i / Convert.ToInt32(message);
await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}
catch(Exception ex)
{
await queueClient.AbandonAsync(message.SystemProperties.LockToken);
}
}
有关更多详细信息,请参阅。如果您的函数是版本2,则可以直接将消息移动到死信子队列,请参见以下示例:
[FunctionName("processData")]
public static void Run(
[ServiceBusTrigger("customer", "customer", AccessRights.Manage, Connection = "ServiceBusConnectionString")]string mySbMsg, string lockToken, MessageReceiver messageReceiver,
ILogger log)
{
log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
// ...
await messageReceiver.DeadLetterAsync(lockToken);
// await messageReceiver.AbandonAsync(lockToken);
// await messageReceiver.CompleteAsync(lockToken);
// await messageReceiver.DeferAsync(lockToken);
// ...
}
哦,明白了,那使用抛弃呢?你的建议是什么?不幸的是,我不知道在信息中调用放弃的效果。我会让其他人对此发表评论。好的,我明白你的意思了,如果api状态不是200,如何在其他情况下放弃该消息?你能在这里给我一段代码吗?