0

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

也可以为其中一个属性启用空值吗?

我想要做的是能够使用 azure 函数以某种方式过滤标识符上​​的消息,具体取决于它是否存在。

我无法仅通过队列消息来做到这一点,因为我找不到插入 som 类型的元数据的方法。

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

我想这样做的原因不是复制整个动作序列,而是在服务总线主题之后的动作中插入某种过滤功能。

- - - - - - - - - - 更新 - - - - - - - - - -

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

当我向带有属性的 servicebus 主题订阅发送 Brokered 消息时,例如:

message.Properties['id'] = "1";

是否可以通过某种方式访问​​该消息属性值?我知道以这种方式使用可能并不重要,但这将为我打开一扇新的大门。

4

1 回答 1

1

根据您的描述,我检查了 C# 的 Service Bus 客户端库,发现在通过NamespaceManager.CreateSubscription创建订阅时,我们只能通过单个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
 });
于 2017-06-22T07:09:42.393 回答