2017-06-16 38 views
1

我已更新到NServiceBus 6,其中IProvideConfiguration<UnicastBusConfig>及其MessageEndpointMappings已过时。在NServiceBus 6中,端点是否可以在不知道发布端点的情况下订阅事件?

我遵循文档中的发布/订阅说明。据我了解,现在需要在订阅事件时明确命名发布端点。

之前,我会具体事件接口,终点将是用户的名称:

config.MessageEndpointMappings.Add(
       new MessageEndpointMapping 
       { 
        AssemblyName = MyAssemblyName, 
        TypeFullName = typeof(IMyEvent)), 
        Endpoint = "SubscribingEndpoint" 
       }); 

现在: 这个消失,我有以下几点。这完全取代了一个IProvideConfiguration类的需要:

var routing = endpointConfiguration.UseTransport<MsmqTransport>().Routing(); 
    endpointConfiguration.SendFailedMessagesTo("error"); 
    endpointConfiguration.AuditProcessedMessagesTo("audit"); 
    //register command 
    routing.RouteToEndpoint(typeof(MyCommand), "SomeEndpoint"); 
    //subscribe to event 
    routing.RegisterPublisher(typeof(IMyEvent), "PublishingEndpoint"); //? 

所以在这里,我将不得不指定IMyEvent的发布者,而不是用户。 在NSB5中,这不是必需的。

那么如果事件由多个端点发布,我该怎么办?

+0

一个事件总是只从一个端点发布(遵循该规则,只有一个发布者......),并且AFAIK始终需要为事件提供发布者地址......您想要什么做? –

+0

@SeanFarmar我明白一个事件只应该由一个端点发布。在NSB5中,订阅者将按照上面所示的方式进行订阅,方法是在MessageEndpointMapping中使用自己的端点名称,而不是发布者的端点名称。 v5文档同样多。这是一个比事件VS命令问题更多的配置问题问题。在这种情况下发送一个命令是可行的,除了为它设置路由更多的工作。 – John

+2

我很困惑,您能否提供链接,指出您可以使用端点的名称而不是发布者的端点名称? AFAIK始终如此(有意义的是)订阅者会向发布者发送订阅消息,因此它需要配置中的发布者端点名称... –

回答

1

要回答你的问题:

所以,我该怎么办,如果该事件由几个端点公布?

您可以通过订阅者的多个RegisterPublisher调用来订阅来自多个发布者的相同事件。

请注意,如果从多个逻辑端点发布相同的事件,通常会将其视为异味。您可能需要考虑为每个逻辑端点使用不同的事件类型,或者从事件切换到命令。如果您不确定消息的设计,强烈建议您访问Particular Software Google Group,人们很乐意为您提供扩展此SO问题的设计问题。

关于V5和V6之间的变化:

在NSB5我的订户将认购正如我上面显示,通过在MessageEndpointMapping利用自身的端点名称,而不是发布者的端点名称。

我很难听到这句话。 V5和V6使用相同的方法来订阅,只是一种不同的语法。

由于您正在使用MSMQ,订阅者必须向每个事件的发布者发送订阅消息。为了让订户知道在哪里发送订阅消息,它需要路由信息。这是V5和V6使用不同语法的地方:

  • V5将在其MessageEndpointMappings中查找匹配的路由。它会将订阅消息发送到映射中指定的端点(在示例代码中将为SubscribingEndpoint)。
  • V6强制实现订阅消息和命令之间的分离。这就是为什么有不同的API用于路由常规命令和路由订阅消息。基于代理的传输(例如,RabbitMQ)不需要订阅消息,因此不需要用于订阅消息的路由,而每个传输仍然需要路由信息来发送命令。

正如你所看到的,V5和V6之间的语法只有不同,应该没有概念上的变化。既然你声称上面的例子中为你工作,我只能想象几个原因是这样的:

  • 你的逻辑端点共享相同的订阅存储,这可能会导致向用户发送端点订阅消息发布者偶然可以看到它。
  • 发布者使用的持久订阅存储器已包含订阅者的订阅。虽然它可能不再接收订阅消息(因为使用您的配置它不应该),它仍然有一个由发布者使用的“旧”订阅。

无论这些原因之一或许能够解释这种行为的观光或者不使用MSMQ传输与NServiceBus时,用户总是需要有配置为出版商为了使订阅消息到达出版商的路线。这种设计在V5和V6之间没有变化。

有一个很好的样本演示发布/订阅两种V5和V6特定的文档可供选择:https://docs.particular.net/samples/pubsub/?version=core_5

我已经更新到NServiceBus 6,其中IProvideConfiguration及其MessageEndpointMappings已过时。

请注意,在V6中,这两个API都过时了警告,但它们仍然继续工作。这些API将在下一个主要版本中删除。

我希望这可以清理一些东西。

相关问题