簡體   English   中英

NServiceBus,當有多個接口時按接口訂閱

[英]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>

您需要將接口實現移動到共享程序集(NsbInterfaces.Events)

向您的回購添加了拉取請求

HTH

我在NSB論壇上提出了這個問題,並將其轉換為一個問題,看來應該在該軟件的v5中解決該問題。 https://github.com/Particular/NServiceBus/issues/2301

在確定之前,我認為有2種選擇:

  • 發送為2條單獨的消息
  • 將實現放入已發布的庫中(感謝@seanfarmar)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM