首页 > 解决方案 > 将 webjob(Microsoft.Azure.WebJobs) 包更新到 3.0.16 版后,没有发生显式死信

问题描述

使用以前的 2.3.0 版本的 webjob 显式死信是可能的。

下面是示例代码

using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;

public static class Program
{
    static ISubscriptionClient subscriptionClient;
    public static void Main()
    {
            var builder = new HostBuilder();
            builder.ConfigureAppConfiguration(c =>
            {

                c.AddJsonFile("appsettings.json");

            });
            builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();               
                b.AddServiceBus(sbOptions =>
                {
                    sbOptions.MessageHandlerOptions.AutoComplete = false;
                    sbOptions.MessageHandlerOptions.MaxConcurrentCalls = 5;                    
                });
            });
            var host = builder.Build();
            using (host)
            {

                host.Run();
            }   
    }
    
    public static async Task ProcessQueueMessage(
            [ServiceBusTrigger("topic_name", "subscription_name")] Message message, TextWriter log)
        {
            subscriptionClient = new SubscriptionClient("connection_string", "topic_name", "subscription_name");

            await subscriptionClient.DeadLetterAsync(message.SystemProperties.LockToken);

            await subscriptionClient.CloseAsync();
        }   
}

使用以前的 webjob(2.3.0 版) JobHostConfiguration() 显式死信是可能的,并且使用 HostBuilder() 的最新版本 3.0.16 没有发生显式死信,它会重试直到达到最大传递计数,然后向死信发送消息,这应该不是预期的行为,只要调用 DeadLetterAsync(),消息就应该进入死信。它在 .net 框架和 .net 核心中都可以观察到。也可以通过使用 MessageHandlerOptions 来实现不使用 webjob 配置显式死信。您能否让我知道如何使用最新版本的 webjob 配置明确地死信。

标签: c#.net-coreazureservicebusazure-webjobsazure-webjobssdk

解决方案


显式死信是 Azure 服务总线 SDK 功能,而不是 WebJobs。您仍然可以这样做,但使用MessageReceiver需要在函数签名中指定的。对消息的所有操作都是通过 ASB SDK track 2 中的消息接收器完成的。这里有一个例子


推荐阅读