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.

更新:

对于接收消息,您可以利用 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
 });