Rebus.Defer在Timeout上丢失标题

时间:2016-01-01 05:08:04

标签: 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())
       .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 - 那是错误的。这种改变仍然行不通。使用非常相似的样本代码,但使用默认适配器,超时标头工作得很好。我将尝试通过添加windsor容器适配器来隔离原因。我可以在复制问题时发布代码链接。

1 个答案:

答案 0 :(得分:0)

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

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

所以,回答你的问题:

在推迟发送消息时,绝对应保留消息标题。

是的:从配置API传递给您的IBus实例应该在应用程序生存期内保持为单例实例。使用Castle Windsor,容器将确保它是单件,并且还将确保在您处理容器时妥善处理。