Azure 服务总线 - SQLFilter 未按预期工作
Azure Service Bus - SQLFilter doesn't works as expected
我正在尝试 运行 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 就停止工作并且我没有再收到任何消息。
我做错了什么?
这是预期的行为。您创建的主题 (CreatedMessages
) 使用过滤器创建一次并按原样存储。 IE。它是静态的。每当您决定需要更改过滤器时,您应该更新您的订阅以获得新的过滤器。
要使用新过滤器更新现有订阅,您可以查看 NamespaceManager.GetRulesAsync(string, string) to get the existing rule(s) for your subscription and then remove the old one using SubscriptionClient.RemoveRuleAsync(String)。
我正在尝试 运行 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 就停止工作并且我没有再收到任何消息。
我做错了什么?
这是预期的行为。您创建的主题 (CreatedMessages
) 使用过滤器创建一次并按原样存储。 IE。它是静态的。每当您决定需要更改过滤器时,您应该更新您的订阅以获得新的过滤器。
要使用新过滤器更新现有订阅,您可以查看 NamespaceManager.GetRulesAsync(string, string) to get the existing rule(s) for your subscription and then remove the old one using SubscriptionClient.RemoveRuleAsync(String)。