Azure 服务总线主题订阅,是否可以拥有多个 sql-filter 属性?
Azure service bus Topic subscription, able to have multiple sql-filter properties?
只是一个关于 Azure 服务总线主题订阅的问题,是否可以将多个属性分配给单个订阅?
是否可以为其中一个属性启用空值?
我想要做的是能够使用 azure 函数根据标识符是否存在以某种方式过滤消息。
我无法仅通过队列消息来执行此操作,因为我找不到插入 som 类型的元数据的方法。
我的问题的另一个解决方案是一个单独的服务总线主题订阅,其中它的 属性 可以接受设置并在两个不同的值之间切换,然后我可以通过它进行过滤。
我想这样做的原因不是复制整个操作序列,只是在可以这么说的服务总线主题之后的操作中插入某种过滤功能。
--------------------更新--------------------
好的所以有点更新,我在这件事上取得了一些进展。与此事相关的另一个问题是:
当我使用 属性 将 Brokered 消息发送到服务总线主题订阅时,例如:
message.Properties['id'] = "1";
是否可以通过某种方式访问该消息属性值?
我知道以这种方式使用它可能并不重要,但这会为我打开一扇新的大门。
根据您的描述,我检查了 C# 的服务总线客户端库,发现在通过 NamespaceManager.CreateSubscription 创建订阅时,我们只能传递一个 Filter
或一个 RuleDescription
使用单个过滤器如下:
public SubscriptionDescription CreateSubscription(string topicPath, string name, Filter filter);
public SubscriptionDescription CreateSubscription(string topicPath, string name, RuleDescription ruleDescription);
正如 Sean Feldman 提到的创建复杂的 SQL 过滤器一样,我创建了我的应用程序来测试它。你可以参考我的测试如下:
示例消息
var body = "Hello World";
var message1 = new BrokeredMessage(body);
message1.Properties["From"] = "Ian Smith";
message1.Properties["MessageId"] = -1;
message1.Label = null;
var message2 = new BrokeredMessage("Second message");
message2.Properties["From"] = "Alan Smith";
message2.Label = "important";
message2.Properties["MessageId"] = 2;
var message3 = new BrokeredMessage("Third message");
message3.Properties["From"] = "Kelly Smith";
message3.Label = "information";
message3.Properties["MessageId"] = 1;
使用过滤器创建订阅
var filter=new SqlFilter("(sys.Label='important' or sys.Label IS NOT NULL) or MessageId<0 or From LIKE '%Smith'");
namespaceManager.CreateSubscription(topicName, subName,filter);
以上订阅可以接收所有三个消息。详情请参考SQLFilter syntax.
更新:
对于接收消息,您可以利用 SubscriptionClient.OnMessage 并参考以下代码片段:
//Processes a message in an event-driven message pump.
client.OnMessage((receivedMessage)=>{
Console.WriteLine(receivedMessage.Properties['id'].ToString());
receivedMessage.Complete(); //manually mark the message as processed and deleted.
},new OnMessageOptions(){
AutoComplete=false,
MaxConcurrentCalls=5
});
只是一个关于 Azure 服务总线主题订阅的问题,是否可以将多个属性分配给单个订阅?
是否可以为其中一个属性启用空值?
我想要做的是能够使用 azure 函数根据标识符是否存在以某种方式过滤消息。
我无法仅通过队列消息来执行此操作,因为我找不到插入 som 类型的元数据的方法。
我的问题的另一个解决方案是一个单独的服务总线主题订阅,其中它的 属性 可以接受设置并在两个不同的值之间切换,然后我可以通过它进行过滤。
我想这样做的原因不是复制整个操作序列,只是在可以这么说的服务总线主题之后的操作中插入某种过滤功能。
--------------------更新--------------------
好的所以有点更新,我在这件事上取得了一些进展。与此事相关的另一个问题是:
当我使用 属性 将 Brokered 消息发送到服务总线主题订阅时,例如:
message.Properties['id'] = "1";
是否可以通过某种方式访问该消息属性值? 我知道以这种方式使用它可能并不重要,但这会为我打开一扇新的大门。
根据您的描述,我检查了 C# 的服务总线客户端库,发现在通过 NamespaceManager.CreateSubscription 创建订阅时,我们只能传递一个 Filter
或一个 RuleDescription
使用单个过滤器如下:
public SubscriptionDescription CreateSubscription(string topicPath, string name, Filter filter);
public SubscriptionDescription CreateSubscription(string topicPath, string name, RuleDescription ruleDescription);
正如 Sean Feldman 提到的创建复杂的 SQL 过滤器一样,我创建了我的应用程序来测试它。你可以参考我的测试如下:
示例消息
var body = "Hello World";
var message1 = new BrokeredMessage(body);
message1.Properties["From"] = "Ian Smith";
message1.Properties["MessageId"] = -1;
message1.Label = null;
var message2 = new BrokeredMessage("Second message");
message2.Properties["From"] = "Alan Smith";
message2.Label = "important";
message2.Properties["MessageId"] = 2;
var message3 = new BrokeredMessage("Third message");
message3.Properties["From"] = "Kelly Smith";
message3.Label = "information";
message3.Properties["MessageId"] = 1;
使用过滤器创建订阅
var filter=new SqlFilter("(sys.Label='important' or sys.Label IS NOT NULL) or MessageId<0 or From LIKE '%Smith'");
namespaceManager.CreateSubscription(topicName, subName,filter);
以上订阅可以接收所有三个消息。详情请参考SQLFilter syntax.
更新:
对于接收消息,您可以利用 SubscriptionClient.OnMessage 并参考以下代码片段:
//Processes a message in an event-driven message pump.
client.OnMessage((receivedMessage)=>{
Console.WriteLine(receivedMessage.Properties['id'].ToString());
receivedMessage.Complete(); //manually mark the message as processed and deleted.
},new OnMessageOptions(){
AutoComplete=false,
MaxConcurrentCalls=5
});