【问题标题】:Azure service bus Topic subscription, able to have multiple sql-filter properties?Azure 服务总线主题订阅,能否拥有多个 sql-filter 属性?
【发布时间】:2017-11-23 20:08:14
【问题描述】:

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

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

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

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

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

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

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

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

当我向具有以下属性的服务总线主题订阅发送代理消息时:

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

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

【问题讨论】:

  • 不完全遵循...如果您询问对一个订阅有多个规则 - 是的,您可以。您还可以创建复杂的 SQL 过滤器。
  • @SeanFeldman 我在这件事上取得了一些进展,我有一个后续问题,请看更新,谢谢。

标签: properties filtering metadata azureservicebus azure-servicebus-topics


【解决方案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 syntax

更新:

对于接收消息,您可以利用Subscription​Client.​On​Message 并参考以下代码sn-p:

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

【讨论】:

  • 我在这件事上取得了一些进展,我有一个后续问题,请看更新,谢谢。
  • 您的意思是要从客户端检索自定义属性,例如Subscription​Client.​On​MessageQueue​Client.​On​Message ?
  • 我不确定我是否理解您的问题,但假设我向主题订阅发送了一条消息,属性为“ID”= 1,例如message.Properties['id'] = "1";我希望能够从具有我发送到主题订阅的该属性的消息中检索值“1”。我有什么意义吗? :P @布鲁斯
  • 我已经更新了我的答案,并提供了接收消息和读取自定义属性的代码sn-p,你可以参考一下。
  • AFAIK,消息也可以反序列化为BrokeredMessage(c#),你可以像public static void Run(BrokeredMessage mySbMsg, TraceWriter log)这样修改你的run.csx并导入Microsoft.ServiceBus程序集。这是一个博客,你可以参考it。此外,您需要先使用 SQL 过滤器创建订阅,然后将其与您的 azure 函数应用绑定。
猜你喜欢
  • 2015-11-03
  • 2018-08-27
  • 2016-02-10
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2018-07-18
  • 1970-01-01
相关资源
最近更新 更多