我们目前使用SqlTransport设置NServiceBus。我们有一个NSB数据库,其中包括所有端点的表TimeoutEntity。 当我们发布一个事件时,系统将在处理事件期间抛出异常,然后NSB尝试将具有相同消息ID的消息插入n次(n - 订阅者计数)到表TimeoutEntity,这导致违反主要事件键。 (不能在对象'dbo.TimeoutEntity'中插入重复键)
这是NSB的错误还是不正确的配置?
我们的配置: 数据库: https://www.dropbox.com/s/p0ex29s6r6v65nu/NSBConfiguration.png?dl=0
配置:
var conf = Configure.With(assemblies)
.CustomConfigurationSource(new BusConfigSource(assemblies))
.DefineEndpointName(ConfigurationManager.AppSettings[EndpointName])
.CastleWindsorBuilder(container)
.PurgeOnStartup(_nsbConfiguration.PurgeOnStartup)
.FileShareDataBus(ConfigurationManager.AppSettings[NServiceBusFileSharePath])
.UnicastBus()
.LoadMessageHandlers();
conf.UseTransport<SqlServer>();
conf.UseNHibernateSubscriptionPersister();
Configure.Features.Enable<SecondLevelRetries>();
Configure.Features.Enable<TimeoutManager>();
Configure.Features.Enable<Sagas>();
Configure.Features.Enable<AutoSubscribe>();
var startableBus = conf.CreateBus();
startableBus.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
已发布的消息具有相同的MessageId和TimeoutPersister(NServiceBus.Nhibernate)将其用作TimeoutId。它是正确的 ?
public void Add(TimeoutData timeout)
{
var timeoutId = Guid.Empty;
string messageId;
if (timeout.Headers.TryGetValue(Headers.MessageId, out messageId))
{
Guid.TryParse(messageId, out timeoutId);
}
if (timeoutId == Guid.Empty)
{
timeoutId = GenerateCombGuid();
}