如何使用 Azure 中转消息将消息发送到特定订阅

How to send message to a particular subscription using Azure brokered messaging

我想使用代理服务(rest)向特定订阅发送消息,我该怎么做。

如果某个主题有很多订阅,我想向特定订阅发送消息。

每个主题上的订阅都应该有自己的规则(订阅),向主题发送消息的客户端通常不想知道发送到哪个订阅。

如果您确实需要这个,请尝试这样的操作:

Client -> Topic  | Subscription 1   |  *
                 | Subscription 2   |  properties.customername = "A"
                 | Subscription 3   |  properties.customername = "B"
                 | Subscription 4   |  properties.special = "123"

要仅向一个订阅发送消息,请确保所有订阅都具有唯一的订阅。在上面的示例中,订阅 1 接收所有消息,将其更改为这样的内容:

Client -> Topic  | Subscription 1   |  properties.customername EXISTS
                 | Subscription 2   |  properties.customername = "A"
                 | Subscription 3   |  properties.customername = "B"
                 | Subscription 4   |  properties.special = "123"

更多信息: https://msdn.microsoft.com/library/azure/microsoft.servicebus.messaging.sqlfilter.sqlexpression.aspx

另一个解决方案可能是创建一个单独的主题来处理这个问题,这个主题可以 "forward" 所有其他请求到您的常规主题。 (可以链接主题以创建此行为) https://azure.microsoft.com/en-us/documentation/articles/service-bus-auto-forwarding/

终于找到了这个问题的答案。答案有以下步骤。

  1. 在客户端创建订阅时,在订阅xml中通过SQL过滤节点,如下所示。

@"<entry xmlns=""http://www.w3.org/2005/Atom"">

  <title type=""text"">" + SubscriptionName + @"</title>

   <content type=""application/xml"">

    <SubscriptionDescription xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"" >
                                         <DefaultRuleDescription>
            <Filter i:type=""SqlFilter"">
                <SqlExpression>" + "VenueId='" + venueId + "' or CustomerId='" + customerId + @"'</SqlExpression>
                 <CompatibilityLevel> 20 </CompatibilityLevel>
             </Filter>
             <Action i:type = ""EmptyRuleAction""/>
             <Name>$Default</Name>
             </DefaultRuleDescription>
      </SubscriptionDescription>
     </content>
            
</entry>";

  1. webClient 中添加 headers,在 sql 过滤器中使用相同的名称,如下所示
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
  1. 创建订阅。此订阅将被创建并有一些过滤器。

  2. 在客户端获取消息的同时在webClient中添加这2个headers。这样它将接收仅具有 CustomerIdVenueId

  3. 过滤器的消息
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
  1. 在服务端发送消息时也添加这两个headers。因此它将向唯一具有这些名称过滤器的订阅发送消息。
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);