2016-01-01 38 views
1

我使用的是Rebus 0.84,我試圖使用像這樣的自定義標題的Defer方法。Rebus.Defer在超時丟失標題

_theBus.AttachHeader(message, "tenant_id", tenantId); 
_theBus.Defer(delay, message); 

但是'超時'發生時頭部不存在。這是我的總線配置。

Configure.With(new WindsorContainerAdapter(container)) 
     .Logging(l => l.Serilog()) 
     .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig()) 
     .MessageOwnership(d => d.FromRebusConfigurationSection()) 
     .Timeouts(t => t.Use(new RavenDbTimeoutStorage(container.Resolve<IDocumentStore>()))) 
     .Sagas(x => x.Use(new RavenDbSagaPersister(container.Resolve<IDocumentSession>, session => { }))) 
     .Events(x => x.AddUnitOfWorkManager(new Config.WindsorUnitOfWorkManager(container))) 
     .CreateBus() 
     .Start() 

這是預期的行爲?這是一個Windows服務,所以我正確設置這是一個單身人士?

編輯 - 我知道發生了什麼更好的主意,我希望它能更好地理解Rebus。

問題是這一行

.Sagas(x => x.Use(new RavenDbSagaPersister(container.Resolve<IDocumentSession>, session => { }))) 

在我們的應用中使用tenant_id頭球幫助我們連接到該消息的正確的數據庫。如果我更改該行以使用配置爲指向特定數據庫的IDocumentStore,則一切正常。這意味着我的傳奇故事和超時時間存儲在與實際租戶數據庫分開的數據庫中。我可以住這個,但我想了解爲什麼當我使用從容器中檢索到的會話時,標題不存在。我懷疑這是由於爲RavenDbSagaPersister創建會話的時間。那是對的嗎?

編輯2 - 那是錯誤的。該更改仍然無效。使用非常相似的sampel代碼,但使用默認的適配器,超時頭文件很好。我將嘗試通過添加windsor容器適配器來隔離原因。當我可以複製問題時,我會發布代碼鏈接。

回答

0

聽起來很奇怪 - 延遲郵件傳遞時應包含標題,事實上我剛剛證實它可以與Rebus 0.84.0一起使用。

雖然我確實記得早期版本的Rebus有一個不包含標題的錯誤,但在版本0.58.0中刪除了錯誤according to Rebus' changelog。推遲的消息時

消息頭絕對應該被保留,也:

因此,要回答你的問題。

是的:從配置API傳遞給你的IBus實例應該在應用程序生存期內保持爲單例實例。隨着溫莎城堡,集裝箱將確保它是一個單身,並且還將確保在處理集裝箱時妥善處理。

+0

難道它與RavenDB存儲有關嗎? – Steven

+0

最終發生在錯誤隊列中的消息實際上是一個「超時回覆」,它幾乎在I bus.defer後立即發生。難道這不是我最初的假設嗎? – Steven

+0

對不起,特別是它的Rebus.Messages.TimeoutRequest – Steven