将 webjob(Microsoft.Azure.WebJobs) 包更新到版本 3.0.16 后,显式死信不会发生

After updating webjob(Microsoft.Azure.WebJobs) package to version 3.0.16 explicit deadletter is not happening

使用之前的 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 核心中都可以观察到。 同样,在不使用 webjob 配置的情况下,可以通过使用 MessageHandlerOptions 来实现显式死信。 你能告诉我如何使用最新版本的 webjob 配置明确死信吗?

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