Используемая версия NServiceBus: 2.0.0.1145
Вопрос:
Можно ли настроить хост NServiceBus таким образом, чтобы он потреблял (подписывался) на свои опубликованные сообщения?
Отвечать:
Это кажется возможным, но в следующей конфигурации это дает мне исключение с заблокированной транзакцией при попытке вставить подписки в SubscriptionStorage. Это происходит, когда вы используете DbSubscriptionStorage и более 1 "NumberOfWorkerThreads".
Ошибка:
Could not execute command:
INSERT INTO Subscription (SubscriberEndpoint, MessageType) VALUES (@p0, @p1)
System.Data.SqlClinet.SqlException:
Transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
После этого NServiceBus пытается отключиться, но терпит неудачу, потому что транзакция все еще выполняется, и выдает исключение UnhandledException.
Как воспроизвести:
Вот мой App.Config:
<!-- Publishing Configuration -->
<MsmqTransportConfig InputQueue="test_publisher_output" ErrorQueue="test_error" NumberOfWorkerThreads="3" MaxRetries="5" />
<!-- Subscription Configuration -->
<UnicastBusConfig DistributorControlAddress="" DistributorDataAddress="" ForwardReceivedMessagesTo="">
<MessageEndpointMappings>
<add Messages="MessageAssembly" Endpoint="test_publisher_output" />
</MessageEndpointMappings>
</UnicastBusConfig>
Моя конфигурация шины:
var bus = Configure.With()
.Log4Net()
.StructureMapBuilder(container)
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.PurgeOnStartup(false)
.DBSubcriptionStorage(subscriptionDbProperties, true)
.Sagas()
.NHibernateSagaPersister(sagaDbProperties, true)
.UnicastBus()
.ImpersonateSender(false)
.LoadMessageHandlers(First<GridInterceptingMessageHandler>
.Then<SagaMessageHandler>())
.CreateBus()
.Start();
и вот мои dbProperties как для подписки, так и для базы данных саги:
connection.provider NHibernate.Connection.DriverConnectionProvider
connection.driver_class NHibernate.Driver.SqlClientDriver
dialect NHibernate.Dialect.MsSql2005Dialect
Все работает нормально, пока я не увеличу NumberOfWorkerThreads выше 1. Все, что выше этого, вызовет указанные выше ошибки.
Надеюсь, я ничего не забыл. Заранее благодарны за Вашу помощь.