[英]Can an NServiceBus endpoint subscribe to multiple publishers of the same message?
[英]NServiceBus, Subscribe by interface when there are multiple interfaces
使用NServiceBus,您可以通過接口進行訂閱,例如:
public class MyEvent: ISomeInterface {}
public class Handler: IHandleMessages<ISomeInterface>{...}
這一切似乎都可以令人滿意地工作,但是當您有多個接口時,例如:
public class MyEvent: ISomeInterface, ISomeOtherInterface {}
public class Handler: IHandleMessages<ISomeInterface>{/*Works fine*/}
public class Handler: IHandleMessages<ISomeOtherInterface>{/*Doesnt work*/}
使用pub / sub時,無論哪種情況,都正確地訂閱了該消息,但是當消息實際發布時,接收到的服務錯誤如下:
找不到消息類型為ISomeInterface的處理程序
僅當您要處理的接口是已發送消息類中的第一個接口時,它才似乎起作用。 如果我在第二個處理程序周圍的實際事件實現上交換接口順序,則工作正常,但第一個錯誤帶有類似消息(即,接口順序是引起問題的原因)
無論構造消息時接口的順序如何,都可以通過某種方式來按接口處理消息?
我已經嘗試使用NSB 3和NSB 4的處理程序來產生相同的結果。
編輯:
根據這里的要求,我正在使用訂戶配置的更詳細的代碼段。 我還整理了一個最小的repro pub / sub應用程序,以演示我遇到的問題( 在github上 )。
Configure.Features.Disable<NServiceBus.Features.TimeoutManager>().Disable<NServiceBus.Features.SecondLevelRetries>();
Configure.With()
.DefineEndpointName("nsbinterfaces.subscriber")
.DefiningEventsAs(t => t.Namespace != null && t.Namespace.Contains(".Events"))
//.NinjectBuilder(kernel)
.DefaultBuilder()
.UseTransport<Msmq>()
.PurgeOnStartup(false)
.MsmqSubscriptionStorage("nsbinterfaces.subscriber")
.UnicastBus()
.LoadMessageHandlers()
.ImpersonateSender(false)
.CreateBus()
.Start(
() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
看了復制后,我想我知道發生了什么事。
您的發布者知道它自己的事件(MyEvent)和它實現的兩個接口。 這兩個接口位於共享的程序集中。
您的訂戶對MyEvent一無所知,因此不知道它實現了這兩個接口。 這是不是一個ISomeInterface或ISomeOtherInterface,所以它反序列化到這些類型之一 。
由於接口的順序似乎決定了接收消息的類型,所以我猜NSB會將消息反序列化為它所知道的第一種類型(每個進程)。
<?xml version="1.0"?>
<Messages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://tempuri.net/NsbInterfaces.Publisher.Events"
xmlns:baseType="NsbInterfaces.Events.ISomeInterface"
xmlns:baseType1="NsbInterfaces.Events.ISomeOtherInterface">
<MyEvent></MyEvent>
</Messages>
我在NSB論壇上提出了這個問題,並將其轉換為一個問題,看來應該在該軟件的v5中解決該問題。 ( https://github.com/Particular/NServiceBus/issues/2301 )
在確定之前,我認為有2種選擇:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.