C# 服务总线消息处理不正确得到异常仍然没有进入死信?

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) {

我有一个azure函数,当新消息进入服务总线主题时触发

[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,如何在其他情况下放弃该消息?你能在这里给我一段代码吗?