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();
}
這聽起來像一個不正確的配置...你使用什麼版本的NServiceBus?你可以分享代碼和錯誤日誌,也許在github或dropbox上? – 2014-11-01 09:26:24
我們使用4.6版本。 – Majkel 2014-11-01 11:32:03
TimeoutEntity是您自己的域實體嗎? – 2014-11-02 18:59:19