/// <summary> /// Completes the transaction scope by committing all enlisted transactions. /// </summary> public void Complete() { if (disposed) { throw new ObjectDisposedException(this.GetType().Name); } lock (transactionDictionary) { foreach (string transactionId in transactionDictionary.Keys) { try { AdapterTransaction transaction = transactionDictionary[transactionId]; if (transaction != null) { ((ITransactional)transaction.Adapter).Commit(transaction); transaction.State = TransactionState.Commited; } } catch (MessageEngineException ex) { if ((MessageEngine.Instance.Tracing.Switch.Level & SourceLevels.Error) == SourceLevels.Error) { MessageEngine.Instance.Tracing.TraceData(TraceEventType.Error, 0, ex); } } } } }
internal void EnlistTransaction(AdapterTransaction transaction) { lock (transactionDictionary) { transactionDictionary[transaction.TransactionId] = transaction; } }
/// <summary> /// Aborts all transactions enlisted in the current scope. /// </summary> private void Abort() { lock (transactionDictionary) { foreach (string transactionId in transactionDictionary.Keys) { try { AdapterTransaction transaction = transactionDictionary[transactionId]; if ((transaction != null) && (transaction.State == TransactionState.Started)) { ((ITransactional)transaction.Adapter).Abort(transaction); transaction.State = TransactionState.Aborted; } } catch (MessageEngineException ex) { if ((MessageEngine.Instance.Tracing.Switch.Level & SourceLevels.Error) == SourceLevels.Error) { MessageEngine.Instance.Tracing.TraceData(TraceEventType.Error, 0, ex); } } } } }
/// <summary> /// Transmits a message. /// </summary> /// <param name="msg">The message to transmit.</param> public void TransmitMessage(MultiPartMessage msg) { if (_isDisposed) { throw new ObjectDisposedException(this.GetType().Name); } if (!_isRunning) { throw new InvalidOperationException("Message Engine is not running."); } CheckMetadata(msg); AdapterBase adapter = AdapterProxy.GetAdapterById(msg.Metadata.ReadAsString("SendAdapterId")); ComponentPipeline pipeline = _sendPipelineDictionary[adapter]; Collection <MultiPartMessage> resultCollection = pipeline.Execute(msg); if (resultCollection != null) { //Check if message should be part of a transaction if (TransactionScope.Current != null) { if (adapter is ITransactional) { ITransactional transactionalAdapter = adapter as ITransactional; AdapterTransaction transaction = transactionalAdapter.StartTransaction(resultCollection[0]); transaction.State = TransactionState.Started; TransactionScope.Current.EnlistTransaction(transaction); transactionalAdapter.TransmitMessage(resultCollection[0], transaction); } else { throw new AdapterException("Adapter: \"" + adapter.AdapterId + "\" is not transactional."); } } else { adapter.TransmitMessage(resultCollection[0]); } } }
internal AdapterTransaction GetTransactionById(string transactionId) { AdapterTransaction transaction = null; syncLock.AcquireReaderLock(MessageEngine.Instance.LockMillisecondsTimeout); try { transactionDictionary.TryGetValue(transactionId, out transaction); } finally { syncLock.ReleaseReaderLock(); } return(transaction); }