我正在使用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容器适配器来隔离原因。我可以在复制问题时发布代码链接。
答案 0 :(得分:0)
这听起来很奇怪 - 延迟消息传递时应包含标题,事实上我刚刚验证它适用于Rebus 0.84.0。
我确实记得,虽然早期版本的Rebus有一个不包含标题的错误,但according to Rebus' changelog错误已在版本0.58.0中删除。
所以,回答你的问题:
在推迟发送消息时,绝对应保留消息标题。
是的:从配置API传递给您的IBus
实例应该在应用程序生存期内保持为单例实例。使用Castle Windsor,容器将确保它是单件,并且还将确保在您处理容器时妥善处理。