0

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

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

4

2 回答 2

1

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

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

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

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

于 2016-03-15T12:19:01.010 回答
0

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

  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添加在 sql 过滤器中使用的同名标题,如下所示
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
  1. 创建订阅。将创建此订阅并具有一些过滤器。

  2. 在客户端检索消息时,还将这两个标头添加到webClient. 这样它就会收到只有过滤器的CustomerId消息VenueId

webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
  1. 在服务端发送消息的同时也添加这两个标头。因此它会将消息发送到唯一具有这些名称的过滤器的订阅。
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
于 2016-03-17T13:15:03.650 回答