无论如何,azure是否根据消息类型将消息路由到适当的处理程序/操作/订阅者?
在NServiceBus中,当发布事件时,只会调用可以处理该事件的订阅者。 Azure服务总线如何实现这一点,因为WCF是一个RPC框架,并不是特别“面向消息”,往往具有
话虽如此,我应该发送类型为MyMessage
的消息,AzureServiceBus如何才知道将此消息传递给MyMessageHandler
WCF服务?我可以配置消息属性和路由,但是当一个像NServiceBus中的简单约定在99%的用例中运行良好时,这是一个真正的PITA。
答案 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);