Ravendb 延迟超时时缺少标头

Ravendb 延迟超时时缺少标头,ravendb,rebus,Ravendb,Rebus,我使用的是Rebus 0.84,我正试图使用Defer方法和这样一个自定义头 _theBus.AttachHeader(message, "tenant_id", tenantId); _theBus.Defer(delay, message); 但发生“超时”时,标头不存在。这是我的总线配置 Configure.With(new WindsorContainerAdapter(container)) .Logging(l => l.Serilog()) .T

我使用的是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()
Configure.With(新WindsorContainerAdapter(容器))
.Logging(l=>l.Serilog())
.Transport(t=>t.UseMSqAndGetInputQueueNameFromAppConfig())
.MessageOwnership(d=>d.fromReBusConfiguration节())
.timeout(t=>t.Use(新的ravendbtimeoutstore(container.Resolve()))
.Sagas(x=>x.Use(新的RavenDbSagaPersister(container.Resolve,session=>{})))
.Events(x=>x.AddUnitOfWorkManager(新配置的WindsorUnitOfWorkManager(容器)))
.CreateBus()
.Start()
这是预期的行为吗?这是一个windows服务,那么我是否正确地将其设置为单例

编辑-我知道我有一个更好的想法发生了什么,我希望这将导致更好地理解REBS

问题在于这条线

.Sagas(x => x.Use(new RavenDbSagaPersister(container.Resolve<IDocumentSession>, session => { })))
.Sagas(x=>x.Use(新的RavenDbSagaPersister(container.Resolve,session=>{})))
在我们的应用程序中,我们使用租户id头来帮助我们连接到该消息的正确数据库。如果我将行更改为使用IDocumentStore,该IDocumentStore配置为指向特定的数据库,那么一切都可以正常工作。这意味着我的传奇和超时存储在一个与实际租户数据库分离的数据库中。我可以这样生活,但我想理解为什么当我使用从容器中检索的会话时,头不存在。我怀疑这是由于RavendBasagPersister会话的创建时间。对吗?


编辑2-这是错误的。这种改变仍然不起作用。使用非常类似的sampel代码,但使用默认适配器,超时头工作得非常好。我将尝试通过添加windsor容器适配器来隔离原因。当我可以复制该问题时,我将发布一个代码链接。

这听起来很奇怪-延迟消息传递时应该包含标题,事实上,我刚刚验证了它与Rebus 0.84.0一起工作

我确实记得Rebus的早期版本有一个不包含头的bug,但是这个错误在版本0.58.0中被删除了

因此,要回答您的问题:

消息头肯定应该保留,在延迟消息时也是如此


是的:从配置API传递给您的
IBus
实例应该在应用程序生命周期内作为单实例保留。使用Castle Windsor,容器将确保它是一个单例,并且在您处理容器时也将确保它被正确处理。

听起来很奇怪-延迟消息传递时应该包含头,事实上,我刚刚验证了它与Rebus 0.84.0一起工作

我确实记得Rebus的早期版本有一个不包含头的bug,但是这个错误在版本0.58.0中被删除了

因此,要回答您的问题:

消息头肯定应该保留,在延迟消息时也是如此


是的:从配置API传递给您的
IBus
实例应该在应用程序生命周期内作为单实例保留。使用Castle Windsor,容器将确保它是一个单例,并且在您处置容器时也将确保它被正确处置。

这与RavenDB存储有关吗?最终出现在错误队列中的消息实际上是一条“超时回复”,几乎在I bus.defer之后立即发生。这可能不是我最初的假设吗?抱歉,特别是Rebus.Messages.TimeoutRequest延迟的消息被包装在
TimeoutRequest
中,它与包装的消息没有相同的头。。。不过,它应该有一个标题,包含消息失败原因的详细信息“延迟消息被包装在一个TimeoutRequest中,它与包装的消息没有相同的标题”-请再次阅读。现在我明白了问题所在。每当tenant_id丢失时,我都会抛出一个错误,但当然,因为TimeoutRequest没有相同的头,所以它当然是错误的。这可能与RavenDB存储有关吗?最终出现在错误队列中的消息实际上是一个“超时回复”,几乎在I bus.defer之后立即发生。这可能不是我最初的假设吗?抱歉,特别是Rebus.Messages.TimeoutRequest延迟的消息被包装在
TimeoutRequest
中,它与包装的消息没有相同的头。。。不过,它应该有一个标题,包含消息失败原因的详细信息“延迟消息被包装在一个TimeoutRequest中,它与包装的消息没有相同的标题”-请再次阅读。现在我明白了问题所在。每当租户id丢失时,我都会抛出一个错误,但当然,因为TimeoutRequest没有相同的头,所以它当然是错误的。