2017-06-16 25 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將在下一個主要版本中刪除。

我希望這可以清理一些東西。

相關問題