NServiceBus NHibernatePersister - 无法在对象'dbo.TimeoutEntity'中插入重复键

时间:2014-10-31 20:40:39

标签: nservicebus

我们目前使用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();
        }

1 个答案:

答案 0 :(得分:0)

这是一个错误。在github上报道 link