如何使用 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/
终于找到了这个问题的答案。答案有以下步骤。
- 在客户端创建订阅时,在订阅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>";
- 在
webClient
中添加 headers,在 sql 过滤器中使用相同的名称,如下所示
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
创建订阅。此订阅将被创建并有一些过滤器。
在客户端获取消息的同时在webClient
中添加这2个headers。这样它将接收仅具有 CustomerId
和 VenueId
过滤器的消息
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
- 在服务端发送消息时也添加这两个headers。因此它将向唯一具有这些名称过滤器的订阅发送消息。
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
我想使用代理服务(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/
终于找到了这个问题的答案。答案有以下步骤。
- 在客户端创建订阅时,在订阅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>";
- 在
webClient
中添加 headers,在 sql 过滤器中使用相同的名称,如下所示
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
创建订阅。此订阅将被创建并有一些过滤器。
在客户端获取消息的同时在
webClient
中添加这2个headers。这样它将接收仅具有CustomerId
和VenueId
过滤器的消息
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);
- 在服务端发送消息时也添加这两个headers。因此它将向唯一具有这些名称过滤器的订阅发送消息。
webClient.Headers.Add("CustomerId", customerId);
webClient.Headers.Add("VenueId", venueId);