如何按约定设置基于Azure内容的路由?

时间:2013-04-03 05:31:00

标签: wcf azure nservicebus servicebus azureservicebus

无论如何,azure是否根据消息类型将消息路由到适当的处理程序/操作/订阅者?

在NServiceBus中,当发布事件时,只会调用可以处理该事件的订阅者。 Azure服务总线如何实现这一点,因为WCF是一个RPC框架,并不是特别“面向消息”,往往具有

  1. monadic的处理程序,例如NServiceBus,ServiceStack和
  2. POCO消息,而不是本机消息。
  3. 话虽如此,我应该发送类型为MyMessage的消息,AzureServiceBus如何才知道将此消息传递给MyMessageHandler WCF服务?我可以配置消息属性和路由,但是当一个像NServiceBus中的简单约定在99%的用例中运行良好时,这是一个真正的PITA。

2 个答案:

答案 0 :(得分:1)

首先,我当然同意你的看法,基于底层类型的路由应该是azure SB的开箱即用功能。

NSB允许通过在名为EnclosedMessageTypes的消息上公开标头属性来基于类型进行路由。

因为ASB依赖于BrokeredMessage类型来启用消息路由,默认情况下不会将包含的类型公开为属性,所以我知道在发送消息之前无法自行提升属性而无法启用此类路由:< / p>

myMessage.Properties.Add("type", typeof(myUnderlyingType)); 

答案 1 :(得分:1)

您可以在服务总线中使用CorrelationFilter。默认情况下,如果只指定一个字符串,则它与消息上的CorrelationId属性匹配。或者,您可以为ContentType等任何其他系统属性指定值,也可以使用您自己的用户Properties进行过滤。

这是一篇博客文章我写,描述了您可以使用的不同类型的模式: http://abhishekrlal.com/2012/02/07/enterprise-integration-patterns-with-service-bus-part-1/

以下示例展示了不同过滤器的使用:http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-6b0d2749

// Create a topic and 3 subscriptions. 
        TopicDescription topicDescription = namespaceManager.CreateTopic(Program.TopicName); 
        Console.WriteLine("Topic created."); 

        // Create a subscription for all messages sent to topic. 
        namespaceManager.CreateSubscription(topicDescription.Path, SubsNameAllMessages, new TrueFilter()); 
        Console.WriteLine("Subscription {0} added with filter definition set to TrueFilter.", Program.SubsNameAllMessages); 

        // Create a subscription that'll receive all orders which have color "blue" and quantity 10. 
        namespaceManager.CreateSubscription(topicDescription.Path, SubsNameColorBlueSize10Orders, new SqlFilter("color = 'blue' AND quantity = 10")); 
        Console.WriteLine("Subscription {0} added with filter definition \"color = 'blue' AND quantity = 10\".", Program.SubsNameColorBlueSize10Orders); 

        // Create a subscription that'll receive all high priority orders. 
        namespaceManager.CreateSubscription(topicDescription.Path, SubsNameHighPriorityOrders, new CorrelationFilter("high")); 
        Console.WriteLine("Subscription {0} added with correlation filter definition \"high\".", Program.SubsNameHighPriorityOrders);