【问题标题】:Azure Service Bus - SQLFilter doesn't works as expectedAzure 服务总线 - SQLFilter 无法按预期工作
【发布时间】:2016-11-13 00:28:49
【问题描述】:

我正在尝试运行官方文档https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/ 中提供的 Azure 服务总线示例。

创建订阅

namespaceManager.CreateSubscription(TopicName, "CreatedMessages", new SqlFilter(@"Type = 'Created'"));

发送消息

public void SendMessages()
{
    var client = TopicClient.CreateFromConnectionString(_connectionString, TopicName);

    for (var i = 0; i < 5; i++)
    {
        var message = new BrokeredMessage("TestMessage " + i);

        if (i%2 == 0)
            message.Properties["Type"] = "Created";
        else
            message.Properties["Type"] = "All";

        client.Send(message);
    }
}

处理消息

    public void ListenMessages()
    {
        Task.Factory.StartNew(() => SubscribeMessages("CreatedMessages"));
    }

    public void SubscribeMessages(string subscription)
    {
        var allMessagesClient = SubscriptionClient.CreateFromConnectionString(_connectionString, TopicName, subscription);

        allMessagesClient.OnMessage(message =>
        {
            try
            {
                Console.WriteLine($"** {subscription} **");
                Console.WriteLine("Body: " + message.GetBody<string>());
                Console.WriteLine("MessageID: " + message.MessageId);
                Console.WriteLine("Message Type: " + message.Properties["Type"]);
                Console.WriteLine();

                message.Complete();
            }
            catch (Exception)
            {
                message.Abandon();
            }
        },
        new OnMessageOptions
        {
            AutoComplete = false,
            AutoRenewTimeout = TimeSpan.FromMinutes(1)
        });
    }

上面的代码按预期工作。

但是,我面临的问题是,当“Type”属性重命名为其他任何内容(例如“MessageType”或“Name”)时,SQLFilter 就会停止工作,我不会再收到任何消息。

我做错了什么?

【问题讨论】:

  • 会不会是旧的基于“类型”的过滤器和新的过滤器相互冲突?请记住,过滤器是持久的。

标签: azureservicebus


【解决方案1】:

这是预期的行为。您创建的主题 (CreatedMessages) 使用过滤器创建一次并按原样存储。 IE。它是静态的。每当您决定需要更改过滤器时,您都应该更新您的订阅以使用新的过滤器。

要使用新过滤器更新现有订阅,您可以查看 NamespaceManager.GetRulesAsync(string, string) 以获取订阅的现有规则,然后使用 SubscriptionClient.RemoveRuleAsync(String) 删除旧规则。

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2012-02-11
    • 2015-08-23
    • 2013-12-23
    相关资源
    最近更新 更多