首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure Service Bus重试策略的回退不起作用?

Azure Service Bus重试策略的回退不起作用?
EN

Stack Overflow用户
提问于 2016-11-16 21:08:40
回答 1查看 619关注 0票数 0

我试图让队列的重试逻辑正常工作,但我遇到了问题。minBackoff变量似乎不起作用。我在日志中看到,一条消息被接收,然后失败,然后几乎立即重试。我的minBackoff设置为600秒。

下面是设置查询的代码:

代码语言:javascript
复制
 NamespaceManager nsManager = NamespaceManager.CreateFromConnectionString(connectionString);
        nsManager.Settings.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(5),
                                                            maxBackoff: TimeSpan.FromSeconds(30),
                                                            maxRetryCount: 3);

        if (!nsManager.QueueExists(queueName))
        {
            nsManager.CreateQueue(queueName);
        }
        else
        {
            nsManager.DeleteQueue(queueName);
            nsManager.CreateQueue(queueName);
        }

        QueueClient client = QueueClient.CreateFromConnectionString(connectionString, queueName);


        client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15),
                                                         maxBackoff: TimeSpan.FromSeconds(600),
                                                         maxRetryCount: 3);
        for (int i = 0; i < 2000; i++)
        {
            UserCreationSubmitted creationMessage = new UserCreationSubmitted()
            {
                CreationStatus = "Step 1",
                Id = Guid.NewGuid(),
                UserName = "user number " + i,
                Userid = Guid.NewGuid()
            };

            BrokeredMessage message = new BrokeredMessage(creationMessage);
            client.Send(message);

        }

这是我认为不应该用的密码.

代码语言:javascript
复制
client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15),
                                                         maxBackoff: TimeSpan.FromSeconds(600),
                                                         maxRetryCount: 3);

        client.OnMessage(message =>
        {

            UserCreationSubmitted msg = message.GetBody<UserCreationSubmitted>();
            Console.WriteLine("------------------------------");
            Console.WriteLine($"Body {msg.UserName}");

            Random rnd = new Random();
            int ranNum = rnd.Next(0, 9);
            if (msg.UserName.Contains(ranNum.ToString()))
            {
                Console.WriteLine("!!!Error!!!");
                Console.WriteLine("------------------------------");
                throw new Exception();
            }
        });

有没有人知道为什么在这里不起作用呢?奇怪的是,maxRetryCount就像一个士兵一样工作,所以我想肯定是我的实现中的某些东西导致其他人无法工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-17 17:36:22

RetryExponential被ASB客户端用来重试,当的失败接收到时,消息正在发生。在您的代码中,在处理OnMessage API回调过程中,会在收到消息之后抛出异常。OnMessage API将放弃信息,导致它立即出现。

有几个选项你可以选择:

  1. 克隆一条消息,将ScheduledEnqueueTimeUtc设置为您想要的延迟,然后发送它,然后完成原始消息。
  2. 推迟您的消息,但是您只能通过SequenceNumber接收它。在这种情况下,您可以创建一个包含原始消息序列号作为有效负载的新消息,调度新消息并发送它。这样,您就可以对原始消息进行传递计数,并对其进行准确的计数。

理想情况下,最好放弃带有timespan的消息,但这在当前的API中是不可能的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40642350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档