2014-10-31 20 views
0

我們當前使用SqlTransport設置NServiceBus。我們有一個用於NSB的數據庫,其中包含所有端點的TimeoutEntity表。 當我們發佈一個事件,並且系統在處理一個事件的時候會拋出一個異常,那麼NSB試圖向表TimeoutEntity插入n次(n - 訂戶計數)具有相同消息ID的消息,這導致違反了首要的關鍵。 (不能在對象'dbo.TimeoutEntity'中插入重複鍵)NServiceBus NHibernatePersister - 不能在對象'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()); 

發佈的消息具有相同的郵件ID以及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(); 
     } 
+0

這聽起來像一個不正確的配置...你使用什麼版本的NServiceBus?你可以分享代碼和錯誤日誌,也許在github或dropbox上? – 2014-11-01 09:26:24

+0

我們使用4.6版本。 – Majkel 2014-11-01 11:32:03

+0

TimeoutEntity是您自己的域實體嗎? – 2014-11-02 18:59:19

回答