2016-01-01 3 views
1

Я использую Rebus 0.84, и я пытаюсь использовать метод Defer с настраиваемым заголовком, подобным этому.Rebus.Defer missing header on Timeout

_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, поэтому я правильно настрою ее на одноэлемент?

Редактировать - У меня есть представление о том, что происходит, и я надеюсь, что это приведет к лучшему пониманию Ребуса.

Проблема с этой линией

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

В нашем приложении мы используем заголовок tenant_id, чтобы помочь нам подключиться к правильной базе данных для этого сообщения. Если я изменю строку, чтобы использовать IDocumentStore, которое настроено для указания на конкретную базу данных, все работает. Это означает, что мои саги и таймауты хранятся в базе данных, которая отделена от фактической базы данных арендатора. Я могу жить этим, но я хотел бы понять, почему заголовок не существует, когда я использую сеанс, извлеченный из контейнера. Я подозреваю, что это связано с сроками создания сеанса для RavenDbSagaPersister. Это верно?

EDIT 2 - Ну, это было ошибкой. Это изменение все еще не работает. Используя очень похожий код sampel, но с адаптером по умолчанию, заголовки тайм-аута отлично работают. Я попытаюсь изолировать причину, добавив адаптер контейнера Windsor. Когда я смогу воспроизвести проблему, я отправлю ссылку на код.

ответ

0

Это звучит странно - заголовки должны быть включены, когда отправленное сообщение отправлено, и на самом деле я только что проверил, что он работает с Rebus 0.84.0.

Я помню, хотя более ранняя версия Rebus имела ошибку, которая не включала заголовки, но according to Rebus' changelog, что ошибка была удалена в версии 0.58.0.

Таким образом, чтобы ответить на ваши вопросы:

Заголовки сообщений обязательно должны быть сохранены, а также при отсрочке сообщений.

И да: Экземпляр IBus, переданный вам из API конфигурации, должен храниться как экземпляр singleton в течение всего срока службы приложения. С Castle Windsor контейнер гарантирует, что он является одиночным, и также обеспечит его правильное расположение при размещении контейнера.

+0

Может ли это иметь какое-либо отношение к хранилищу RavenDB? – Steven

+0

сообщение, которое заканчивается в очереди ошибок, на самом деле является «ответом на таймаут», и это происходит почти сразу после I bus.defer. Может ли это быть чем-то иным, чем мое первоначальное предположение? – Steven

+0

Извините, в частности это Rebus.Messages.TimeoutRequest – Steven