Rebus.Defer отсутствует заголовок на тайм-аут
Я использую Rebus 0.84 и пытаюсь использовать метод 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, так что я правильно настроил ее, чтобы она была одиночной?
Редактировать - Я знаю, что имею лучшее представление о том, что происходит, и я надеюсь, что это приведет к лучшему пониманию Ребуса.
Проблема с этой линией
.Sagas(x => x.Use(new RavenDbSagaPersister(container.Resolve<IDocumentSession>, session => { })))
В нашем приложении мы используем заголовок tenant_id, чтобы помочь нам подключиться к правильной базе данных для этого сообщения. Если я изменю строку, чтобы использовать IDocumentStore, который настроен для указания на конкретную базу данных, все работает. Это означает, что мои саги и тайм-ауты хранятся в базе данных, которая отделена от фактической базы данных клиентов. Я могу жить так, но мне хотелось бы понять, почему заголовок не существует, когда я использую сеанс, извлеченный из контейнера. Я подозреваю, что это связано со сроками создания сессии для RavenDbSagaPersister. Это верно?
РЕДАКТИРОВАТЬ 2 - Хорошо, что ошибся. Это изменение все еще не работает. Используя очень похожий код sampel, но с адаптером по умолчанию, заголовки тайм-аута работают отлично. Я собираюсь попытаться определить причину, добавив адаптер контейнера Windsor. Я опубликую ссылку на код, когда смогу повторить проблему.
1 ответ
Это звучит странно - заголовки должны быть включены, когда доставлено отложенное сообщение, и на самом деле я только что проверил, что оно работает с Rebus 0.84.0.
Я помню, что в более ранней версии Rebus была ошибка, которая не включала заголовки, но согласно журналу изменений Rebus эта ошибка была удалена в версии 0.58.0.
Итак, чтобы ответить на ваши вопросы:
Заголовки сообщений обязательно должны быть сохранены, даже при задержке сообщений.
И да: IBus
Экземпляр, переданный вам из API конфигурации, должен храниться как одноэлементный экземпляр в течение всего времени жизни приложения. С Castle Windsor контейнер будет гарантировать, что он является синглтоном, а также будет гарантировать его правильную утилизацию при утилизации контейнера.