WCF msmq транзакция и единица работы
Я построил службу WCF MSMQ, которая является транзакционной. В моей работе я использовал следующий атрибут:
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
Я использую службу Nhibernate. Используя Nhibernate, я даю фиксацию на моем сеансе. Если я отключу фиксацию Nhibernate, сообщение будет правильно обработано и удалено из очередей. С этой фиксацией транзакция Nhibernate выполняется правильно, но мое сообщение переходит в очередь повторов.
Вот исключение, которое я получаю в трассировке службы Nhibernate.
Description Handling an exception. Exception details: System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Transaction'.
at System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)
at System.Transactions.TransactionScope.SetCurrent(Transaction newCurrent)
at System.Transactions.TransactionScope.PushScope()
at System.Transactions.TransactionScope.Initialize(Transaction transactionToUse, TimeSpan scopeTimeout, Boolean interopModeSpecified)
at System.Transactions.TransactionScope..ctor(Transaction transactionToUse, TransactionScopeAsyncFlowOption asyncFlowOption)
at System.Transactions.TransactionScope..ctor(Transaction transactionToUse)
at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)
--- End of inner exception stack trace ---
at System.Transactions.TransactionStatePromotedAborted.PromotedTransactionOutcome(InternalTransaction tx)
at System.Transactions.TransactionStatePromotedEnded.EndCommit(InternalTransaction tx)
at System.Transactions.CommittableTransaction.Commit()
at System.ServiceModel.Dispatcher.TransactionInstanceContextFacet.Complete(Transaction transaction, Exception error)
Кажется, что nhibernate совершает уничтожение транзакции на WCF. Я не могу найти способ исправить это.
Любая помощь может быть оценена
Ответы
Ответ 1
Я не слишком хорошо знаком с этими системами, но самый простой ответ, как правило, правильный, поэтому я дам ему шанс - предположим, я бы сказал, что любой сервис, на который вы звоните, останавливая процесс, который удаляет элементы, прежде чем он сможет их удалить, поэтому я бы добавил какой-то вызов функции в службу, вызывающую элементы, чтобы она была вынуждена удалить элемент из списка, прежде чем он сможет закончить транзакции.
Конечно, я не знаком с этой темой, поэтому не задумывайтесь об этом - это просто то, что я сделал бы для подобной проблемы в рамках моих знаний о программировании.