代码之家  ›  专栏  ›  技术社区  ›  Pankaj Rawat

ServiceBus重试策略不适用于QueueClient

  •  0
  • Pankaj Rawat  · 技术社区  · 8 年前

    我想限制azure servicebus队列接收器中的重试次数。

    使用控制台应用程序发送消息 最大重试次数:3

    private static async Task MainAsync()
        {
            string connectionString = ConfigurationManager.AppSettings["ServiceBusConnection"];
            QueueClient queueClient = QueueClient.CreateFromConnectionString(connectionString, QueueName);
            queueClient.RetryPolicy = new RetryExponential(
                    minBackoff: TimeSpan.FromSeconds(0),
                    maxBackoff: TimeSpan.FromSeconds(30),
                    maxRetryCount: 3);
    
            string tradeData = File.ReadAllText("TradeSchemaDemo.json");
            var message = new BrokeredMessage(tradeData);
            await queueClient.SendAsync(message);
            await queueClient.CloseAsync();
        }
    

    另一边我有azure函数来接收消息,

    public static void run([ServiceBusTrigger("TestQueue", AccessRights.Manage, Connection = "servicebusconnection")]string myqueueitem, TraceWriter log)
        {
            retry++;
            System.Console.WriteLine($"Retry attempt {retry}");
            throw new System.Exception("Human error");
            log.Info($"c# servicebus queue trigger function processed message: {myqueueitem}");
        }
    

    不过,我的函数调用了10次。为什么??

    2 回复  |  直到 8 年前
        1
  •  0
  •   Mikhail Shilkov    8 年前

    在这种情况下, RetryPolicy 定义发送操作(不是在接收端)的重试次数。

    接收器重试次数由队列属性定义 Max Delivery Count . 您可以使用服务总线资源管理器等工具在队列级别设置它,也可以在创建队列时以编程方式设置它:

    var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
    var queue = new QueueDescription(queueName);
    queue.MaxDeliveryCount = 3;
    if (!namespaceManager.QueueExists(queueName))
        namespaceManager.CreateQueue(queue);
    
        2
  •  0
  •   Pankaj Rawat    8 年前

    万一有人想看代码

    private static async Task MainAsync()
        {
            string connectionString = ConfigurationManager.AppSettings["ServiceBusConnection"];
            var nm = NamespaceManager.CreateFromConnectionString(connectionString);
            var queue = new QueueDescription(QueueName);
            queue.MaxDeliveryCount = 3;
            if (!nm.QueueExists(QueueName))
                await nm.CreateQueueAsync(queue);
    
            QueueClient queueClient = QueueClient.CreateFromConnectionString(connectionString, QueueName);
            string tradeData = File.ReadAllText("TradeSchemaDemo.json");
            var message = new BrokeredMessage(tradeData);
            await queueClient.SendAsync(message);
            await queueClient.CloseAsync();
        }