Azure服务总线主题订阅,是否可以具有多个sql-filter属性?

最后发布: 2017-06-21 05:15:01


问题

只是有关Azure服务总线主题订阅的问题,是否可以将多个属性分配给单个订阅?

还可以对其中一个属性启用空值吗?

我正在尝试做的是能够使用azure函数以某种方式根据标识符是否存在来过滤消息。

我无法仅通过队列消息来执行此操作,因为我找不到插入som类型的元数据的方法。

解决我的问题的另一种方法是单独的服务总线主题订阅,其中其属性可以接受设置并在两个不同的值之间切换,然后可以通过该值进行过滤。

我要执行此操作的原因不是要复制整个动作序列,而是要在Service Bus主题之后在动作内部插入某种过滤功能。

-------------------- UPDATE -------------------

好了,我做了一些更新,在这件事上取得了一些进展。 与这个问题有关的另一个问题是:

当我将带有代理的消息发送到具有属性的servicebus主题订阅时,例如:

message.Properties ['id'] =“ 1”;

是否有可能以某种方式访问​​该邮件属性? 我知道以这种方式使用可能不重要,但这将为我打开一扇新门。

properties filtering metadata azureservicebus azure-servicebus-topics
回答

根据您的描述,我检查了Service Bus客户端库中的C#,并发现通过NamespaceManager.CreateSubscription创建预订时,我们只能通过单个Filter或带有单个FilterRuleDescription ,如下所示:

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语法

更新:

要接收消息,您可以利用Subscription Client.On Message并参考以下代码片段:

//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
 });