只是有关Azure服务总线主题订阅的问题,是否可以将多个属性分配给单个订阅?
还可以对其中一个属性启用空值吗?
我正在尝试做的是能够使用azure函数以某种方式根据标识符是否存在来过滤消息。
我无法仅通过队列消息来执行此操作,因为我找不到插入som类型的元数据的方法。
解决我的问题的另一种方法是单独的服务总线主题订阅,其中其属性可以接受设置并在两个不同的值之间切换,然后可以通过该值进行过滤。
我要执行此操作的原因不是要复制整个动作序列,而是要在Service Bus主题之后在动作内部插入某种过滤功能。
-------------------- UPDATE -------------------
好了,我做了一些更新,在这件事上取得了一些进展。 与这个问题有关的另一个问题是:
当我将带有代理的消息发送到具有属性的servicebus主题订阅时,例如:
message.Properties ['id'] =“ 1”;
是否有可能以某种方式访问该邮件属性? 我知道以这种方式使用可能不重要,但这将为我打开一扇新门。
根据您的描述,我检查了Service Bus客户端库中的C#,并发现通过NamespaceManager.CreateSubscription创建预订时,我们只能通过单个Filter
或带有单个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语法 。
更新:
要接收消息,您可以利用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
});