2013-02-27 38 views
1

在NServiceBus中,您可以創建一個SendOnly總線,這意味着它只會將消息發送到另一個服務。在我看來,這應該不需要本地隊列的發送服務,但我一直無法配置此。SendOnly模式,沒有本地隊列

var bus = Configure.With() 
    .DefiningCommandsAs(t => typeof(MyNamespace.Messaging.Markers.ICommand).IsAssignableFrom(t)) 
    .DefaultBuilder() 
    .XmlSerializer() 
    .MsmqTransport() 
    .UnicastBus() 
    .SendOnly(); 

給出了以下異常:

無法生成任何端點名稱,請註明使用Configure.DefineEndpointName(...)

自己 約定雖然我能解決這個問題通過增加一個.DefineEndpointName它似乎可憐的形式爲這個服務創建一個隊列,因爲它永遠不會被實際使用。

是否有避免需要爲僅發送總線創建本地隊列的方法,如果不是,爲什麼在此模式下需要此本地隊列?

+0

我很確定有一個DoNotCreateQueues()或類似的可用,如果你添加它會發生什麼? – 2013-02-27 20:45:20

+0

@AdamFyles我不知道那是在那裏,它看起來非常有前途,但不幸的是,我將它添加到配置後仍然出現相同的錯誤。 – 2013-02-27 20:49:10

+1

這應該工作沒有'.DefineEndpointName(...)'(測試對v3.3.5),請參閱[sendonly示例](https://github.com/NServiceBus/NServiceBus/blob/master/Samples/SendOnlyEndpoint/SendOnlyEndpoint。自定義/ Program.cs中)。你正在運行什麼版本的NServiceBus? – 2013-02-28 02:06:30

回答

2

無論是否僅發送,所有端點都需要一個名稱。這與創建隊列無關(是隊列名稱==端點名稱)。添加一個定義端點名稱,你會看到沒有隊列將被創建。另請注意,發送的郵件不會包含地址回覆,因爲這樣做沒有意義。

+0

有趣的是,它不創建隊列,爲什麼它不需要.DefineEndpointName如果我不使用.DefiningCommandsAs?我還注意到,在發送不帶.DefineEndpointName時,它會引用不存在的發件人隊列。 – 2013-03-03 08:44:33

+1

我的猜測是,通過跳過約定找不到消息,並且不會觸發端點名稱的此問題。我需要檢查以確保代碼 – 2013-03-03 17:47:59

1

我相信這是提供消息來源的地方。發送隊列是MSMQ的固有部分。它允許確認消息,支持NServiceBus總線。回覆功能。

在這種情況下似乎沒有必要,但是如果我們認爲SendOnly正試圖引導開發人員使用特定的消息傳遞風格。考慮到支持多種消息類型的MSMQ,我認爲這不是一個問題。

+0

這是有道理的,它仍然看起來有點醜陋,但我得到原因:) – 2013-02-27 21:01:35