1

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

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

  1. 单子处理程序,例如。NServiceBus、ServiceStack 和
  2. POCO 消息,而不是本机消息。

话虽这么说,我应该发送 Type 消息,MyMessageAzureServiceBus 怎么知道只将此消息传递给MyMessageHandlerWCF 服务?我可以配置消息属性和路由,但这是一个真正的 PITA,因为像 NServiceBus 中的简单约定对于 99% 的用例都非常有效。

4

2 回答 2

1

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

NSB 允许基于类型的路由,方法是在消息上公开一个名为 EnclosedMessageTypes 的标头属性。

因为 ASB 依赖 BrokeredMessage 类型来启用消息路由,默认情况下不会将包含的类型公开为属性,所以我不知道在发送消息之前不自己提升属性的情况下,没有办法启用这种路由:

myMessage.Properties.Add("type", typeof(myUnderlyingType)); 
于 2013-04-03T08:27:42.337 回答
1

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

这是我写的一篇博客文章,描述了您可以使用的不同类型的模式: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); 
于 2013-04-03T16:18:26.693 回答