0

我构建了一个服务,每隔几分钟就轮询我们 ASB 上的队列和主题。该代码有一个设置类的初始化部分,以及在调用类的某些函数的 cron 作业上运行的部分。

我面临的问题是,在运行它时,我在每次预定执行时都得到相同的计数。一旦我停止服务并重新运行它,我就会得到更新的数字。

我的解决方案是在每次计划运行时重新初始化所有内容。现在的问题是我需要添加一些功能,这不是一个选项。

以下是我试图尽可能简化的代码(仅用于主题):

代码的初始化看起来像

var nsmgr = NamespaceManager.CreateFromConnectionString("conn string");
var topics = nsmgr.GetTopics();

foreach (var topic in topics)
{
    var subscriptions = nsmgr.GetSubscriptions(topic.Path);
    foreach (var subscription in subscriptions)
    {         
        someStaticListOfAlerts.Add(new Alert (subscription.Name,()=> (int)subscription.MessageCountDetails.ActiveMessageCount))      

    }
}

每隔几分钟调用一次的代码是

foreach (Alert a in someStaticListOfAlerts)
{
    a.Refresh();
}

警报类的简化

public class Alert {
    public Alert (string name, Func<int> count)
    {
      // set in local vars
    }
    public void Refresh()
    {
      Console.Write ($"{_name} - {_count()}");
    }
}

这是 SubscriptionDescription 类的预期行为吗?在刷新 SubscriptionDescription 或订阅方面,我在 MSDN 上找不到太多信息,这让我相信每次调用 MessageDetails.Count 时它都应该返回最新的数字。

我究竟做错了什么?

4

1 回答 1

1

我对未更新的 SubscriptionDescription MessageCount 值有类似的问题。我发现 MessageCount 属性不会向服务询问实际的消息编号,而是在您创建 SubscriptionDescription 对象的那一刻进行初始化。

要获取更新的消息编号,您必须再次从 NamespaceManager 获取 SubscriptionDescription。

NamespaceManager.GetSubscription("TopicName", "SubscriptionName").MessageCount;
于 2018-03-30T09:10:49.317 回答