Rebus.Defer 缺少 header 超时

Rebus.Defer missing header on Timeout

我正在使用 Rebus 0.84,我正在尝试将 Defer 方法与这样的自定义 header 结合使用。

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

但是当 'timeout' 发生时 header 不存在。这是我的总线配置。

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 header 来帮助我们连接到该消息的正确数据库。如果我更改行以使用配置为指向特定数据库的 IDocumentStore,则一切正常。这意味着我的传奇和超时存储在与实际租户数据库分开的数据库中。我可以这样生活,但我想了解为什么当我使用从容器中检索到的 session 时 header 不存在。我怀疑这是由于为 RavenDbSagaPersister 创建 session 的时机所致。那是对的吗?

编辑 2 - 好吧,那是错误的。该更改仍然无效。使用非常相似的样本代码但使用默认适配器,超时 headers 工作得很好。我将尝试通过添加 windsor 容器适配器来找出原因。当我可以复制问题时,我将 post 对代码进行 link。

这听起来很奇怪 - headers 应该在传递延迟消息时包含在内,事实上我刚刚验证它适用于 Rebus 0.84.0。

我确实记得 Rebus 的早期版本有一个不包含 headers 的错误,但 according to Rebus' changelog 该错误已在版本 0.58.0 中删除。

所以,回答你的问题:

绝对应该保留消息 headers,在延迟消息时也是如此。

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